Transactional Outbox Deseni: Mikroservislerde Güvenilir Olay Yayınlama
Modern olaya dayalı mikroservis mimarilerinde (Event-Driven Architecture), servisler durum değişikliklerini bildirmek için sürekli olarak OrderCreated veya PaymentProcessed gibi olaylar yayınlar.
Ancak olay yayınlamayı %100 güvenilir hale getirmek ciddi bir mimari zorluktur: Veritabanı güncellemesi ile olay yayınlamanın aynı anda başarılı olmasını veya birlikte iptal edilmesini nasıl sağlarsınız?
Bir mikroservis yerel veritabanını (PostgreSQL, MySQL) güncelledikten sonra ağ üzerinden mesaj kuyruğuna (Apache Kafka, RabbitMQ) mesaj göndermeye çalıştığında, ağ kesintileri veri tutarsızlığına yol açabilir.
Bu sorunu çözmek için Transactional Outbox Deseni kullanılır.
Çift Yazma Sorunu (Dual-Write Problem)
Bir servis sırayla iki ayrı yazma işlemi gerçekleştirdiğinde:
- İş verisini yerel veritabanına kaydetmek.
- Olayı Kafka mesaj kuyruğuna yayınlamak.
Veritabanı kaydı başarılı olur ancak Kafka gönderimi ağ hatası nedeniyle başarısız olursa, veri kaydedilir fakat alt servisler haberdar edilemez. Sonuç: Veri tutarsızlığı.
Transactional Outbox Deseni Nedir?
Bu desen ilişkisel veritabanlarının yerel ACID işlem (Transaction) yeteneğinden faydalanır.
Mesajı doğrudan ağ üzerinden göndermek yerine, servis olay verisini aynı veritabanı işlemi içinde Outbox Tablosu adı verilen özel bir tabloya yazar.
ACID garantisi sayesinde: Her iki yazma işlemi ya birlikte onaylanır ya da birlikte geri alınır.
Daha sonra bağımsız bir arka plan işlemi (Message Relay), Outbox tablosundaki verileri okuyarak mesaj kuyruğuna iletir.
Mesaj İletim Stratejileri: Polling Publisher vs. CDC (Debezium)
1. Sorgulama Yöntemi (Polling Publisher)
Belirli aralıklarla çalışarak işlenmemiş kayıtları (SELECT * FROM outbox_events WHERE processed = FALSE) sorgular, Kafka’ya gönderir ve durumu günceller.
- Avantajlar: Uygulaması kolay, ek altyapı gerektirmez.
- Dezavantajlar: Sorgulama aralığı kadar gecikme ve veritabanı yükü.
2. Veri Değişikliği Yakalama (CDC ile Debezium)
Debezium doğrudan veritabanı işlem günlüklerini (PostgreSQL WAL) okur ve değişiklikleri anında Kafka’ya aktarır.
- Avantajlar: Neredeyse sıfır gecikme ve uygulama seviyesinde veritabanı yükü olmaması.
- Dezavantajlar: Kafka Connect altyapısı kurulumu gerektirir.
Özet
Transactional Outbox Deseni, dağıtık mikroservis sistemlerinde nihai tutarlılığı (eventual consistency) ve veri güvenilirliğini sağlamak için kritik bir tasarım desenidir.