Sistem Entegrasyonlarında Outbox Deseni ile Veri Tutarlılığı
Dağıtık mimarilerde mesaj kuyruğu yayınlama ve veritabanı işlemleri arasındaki veri tutarlılığını Outbox deseniyle nasıl sağlarsınız?

Dağıtık Mimarilerde Veri Tutarlılığı ve Zorlukları
Günümüz yazılım projelerinde, farklı servislerin ve modüllerin birbirleriyle uyum içinde çalışması kritik bir gereksinimdir. Özellikle Sistem Entegrasyonları süreçlerinde, ERP, muhasebe, ödeme, SMS, e-posta ve üçüncü taraf sistemler arasında güvenilir veri akışı sağlanması gerekir. Ancak dağıtık mimari yapılarında, yerel veritabanı işlemleri ile bir mesaj kuyruğu sistemine olay (event) fırlatma adımı arasında anlık kopukluklar yaşanabilir.
Bir veritabanı transaction'ı başarıyla tamamlandığı halde, hemen ardından tetiklenen mesaj kuyruğu gönderimi ağ hataları veya sunucu kesintileri nedeniyle başarısız olabilir. Bu durum, servisler arasında veri tutarlılığı sorunlarına ve kopukluklara yol açar. Bu gibi senaryolarda geleneksel yaklaşımlar yetersiz kalmaktadır.
Transactional Outbox Deseninin Çalışma Mantığı
Bu tutarsızlıkları ortadan kaldırmak için Transactional Outbox deseni kullanılır. Bu tasarım deseninin temel prensibi, mesajın gönderileceği hedef [mesaj kuyruğu] sistemine doğrudan bağlanmak yerine, öncelikle ilgili veritabanı tablosuna (outbox tablosu) aynı transaction içinde kaydedilmesidir.
- İş mantığı çalıştırılır ve ana veri tablosu güncellenir.
- Aynı transaction sınırları içinde, üretilmesi gereken olay verisi outbox tablosuna yazılır.
- Veritabanı transaction'ı başarılı bir şekilde onaylanır (commit).
Bu yöntem sayesinde, ana veri ile dış dünyaya iletilecek olay verisi atomik bir şekilde [postgresql] gibi ilişkisel veritabanlarında saklanmış olur. Veritabanı güncellendiyse outbox kaydı da kesinlikle mevcuttur.
PostgreSQL ve Mesaj Kuyruğu ile Adım Adım Uygulama
[postgresql] veritabanı altyapısı kullanılarak bu süreç güvenli bir şekilde kurgulanabilir. Outbox tablosu, işlenecek olayların kimliğini, tipini, yükünü (payload) ve işlenme durumunu tutacak sütunlara sahip olmalıdır.
- Tablo Tasarımı: Outbox tablosunda
id,aggregate_type,payload,created_atveprocessedalanları tanımlanır. - Transactional Kayıt: İşlem gerçekleştiğinde, ana veritabanı tablosuna yazma işlemi ile outbox tablosuna yazma işlemi tek bir transaction altında yürütülür.
- Arka Plan Okuyucu (Message Relay): Ayrı bir arka plan süreci (polling veya transaction log mining yöntemiyle), outbox tablosundaki işlenmemiş kayıtları periyodik olarak tarar.
- Kuyruğa İletim: Okunan veriler harici [mesaj kuyruğu] sistemine iletilir ve iletim onaylandığında outbox tablosundaki ilgili kaydın durumu güncellenir.
Sonuç
Dağıtık sistemlerde güvenilir entegrasyonlar inşa etmek, olası hata senaryolarına karşı dayanıklı olmayı gerektirir. Outbox deseni, [sistem entegrasyonu] süreçlerinizde veri kaybını önleyerek sistemlerin senkronize ve kararlı çalışmasına olanak tanır.
Farazi Senaryo: E-Ticaret Sipariş Süreci ve Ödeme Entegrasyonu
E-ticaret platformumuzda bir müşterinin sipariş oluşturma sürecini ele alalım. Sipariş veritabanına kaydedilirken aynı zamanda dış servisler üzerinden ödeme alınması ve stokların düşülmesi gerekmektedir. İş mantığı, sipariş tablosunu güncellerken aynı transaction sınırları içerisinde bir sipariş oluşturuldu olayını outbox tablosuna yazar. Bu senaryoda veritabanı commit edilir edilmez ağ kesintisi yaşandığını varsayalım. Geleneksel yaklaşımlarda mesaj kuyruğuna bildirim gidemez ve stoklar güncellenmeyebilirdi. Ancak Outbox deseni sayesinde, arka plandaki mesaj okuyucu bileşen sistem tekrar ayağa kalktığında outbox tablosundaki işlenmemiş kaydı yakalar. Kaydı güvenli bir şekilde harici mesaj kuyruğuna iletir ve başarılı iletim sonrasında kaydı günceller.
Bu aşamada karşılaşılan en büyük ticari takas performans ile tutarlılık arasındadır. Polling tabanlı okuyucular veritabanına ek yük bindirirken, Transaction Log Mining yaklaşımları karmaşıklığı artırır. Hata yönetiminde ise mesajların idempotent (tekrarlanabilir) işlenmesi kritik önem taşır; çünkü ağ zaman aşımı nedeniyle aynı olay iki kez kuyruğa verilebilir. Tüketici servislerin bu durumu ele alabilmesi için benzersiz anahtarlar kullanması sistem kararlılığını artırır.
Adım Adım Uygulama ve Kontrol Listesi
Outbox desenini canlı ortama alırken sistemin uçtan uca güvenilir çalışmasını sağlamak için dikkat edilmesi gereken teknik adımlar şunlardır:
- Atomik İşlem Doğrulaması: Ana veri tabanı işlemleri ile outbox kayıtlarının kesinlikle aynı veritabanı transaction bloğu içinde gerçekleştirildiğini test edin.
- Tablo İndekslemesi: Outbox tablosundaki işlenme durumu ve oluşturulma zamanı alanlarına uygun indeksler ekleyerek arka plan okuyucu performansını optimize edin.
- Idempotency Desteği: Mesaj kuyruğunu tüketen servislerin aynı olayı birden fazla kez alabileceğini varsayarak idempotent mimari tasarımı yapın.
- Hata Yönetimi ve Yeniden Deneme: Kuyruğa iletim başarısız olduğunda sistemin kilitlenmemesi için üstel artan bekleme (exponential backoff) mekanizmaları kurun.
- Ölü Mektup Kuyruğu: Belirli bir deneme sayısını aşan ve işlenemeyen hatalı kayıtlar için bir Dead Letter Queue (DLQ) mekanizması tanımlayın.
- İzlenebilirlik: Outbox kayıtlarının yaşam döngüsünü takip etmek üzere loglama ve metrik toplama altyapılarını entegre edin.
Kaynaklar
- Sistem Entegrasyonları — Cy Logic Software