Veri Tutarlılığı : Outbox Pattern ve Debezium

0 66

Modern yazılım mimarilerinde, özellikle microservis mimarisine geçiş yapan projelerde veri tutarlılığı ve mesajlaşma yönetimi kritik bir önem taşır.

Bu yazıda Outbox Pattern’i detaylıca ele alacak, Kafka’ya doğrudan yazan bir servisin dezavantajlarını inceleyecek, aynı servise

Outbox Pattern ekleyerek karşılaştırma yapacak ve Debezium kullanımıyla nasıl bir alternatif senaryo oluşturulabileceğini göstereceğiz.

1. Kafka’ya Doğrudan Yazma Veri Akışı

Kafka’ya doğrudan yazan bir servis tasarladığımızı varsayalım. Bu senaryoda servis, gelen her istekte veritabanına yazma işlemini tamamladıktan sonra Kafka’ya mesaj göndermekle yükümlüdür.

 

Controller:

Service:

Dezavantajları:

  1. Çift Yazma Problemi: Veritabanı işlemi başarılı olur ancak Kafka’ya mesaj gönderimi başarısız olursa, veri tutarsızlığı oluşur.
  2. Hata Yönetimi Zorluğu: Tek tek işlem yapıldığından geri alma (rollback) işlemleri karmaşıklaşır.
  3. Düşük Güvenilirlik: Messsage broker’ın geçici hataları, işlemlerin tamamlanamamasına neden olabilir.

 

2. Outbox Pattern Uygulanması

Outbox Pattern kullanarak, Kafka’ya mesaj gönderimini doğrudan değil, bir “outbox” tablosu üzerinden gerçekleştiriyoruz.

Bu yaklaşımda mesajlar önce veritabanına yazılır, ardından bir mesaj işleyicisi tarafından Kafka’ya gönderilir.

outbox pattern

Outbox Tablosu

Not: Controller class’ında değişen bir kod parçası yok o yüzden eklemedim.

Service

Producer

3. Debeizum ile Outbox Pattern

Debezium, veritabanı değişikliklerini izleyen bir değişiklik veri yakalama (CDC) aracıdır. Outbox Pattern ile birlikte kullanıldığında, outbox tablosundaki değişiklikler Debezium tarafından otomatik olarak algılanır ve Kafka’ya gönderilir.

Debezium ile Outbox Veri Akışı

  1. Servis, veritabanına bir kayıt ekler.
  2. Debezium, outbox tablosundaki yeni eklenen veya güncellenen kayıtları algılar.
  3. Debezium, bu değişiklikleri Kafka’ya gönderir.

Docker Compose Konfigürasyonu

3.1 Docker Compose ile Servisleri Çalıştırın

Bu işlemden sonra:

  • PostgreSQL veritabanı çalışır durumda olacak.
  • Kafka ve Zookeeper iletişim için hazır olacak.
  • Debezium Connect, Kafka ve PostgreSQL ile entegre edilecek.

3.2 Debezium Connector Yapılandırması

Debezium’u çalıştırmak için bir connector konfigürasyonu oluşturmanız gerekiyor. Aşağıdaki adımları izleyin:

Debezium için bir connector.json dosyası oluşturun. Örneğin:

Debezium, PostgreSQL veritabanı üzerinde bir “outbox” tablosunu izlemek için aşağıdaki yapılandırmayı kullanır:

Debezium Connector Ayarları

Bu yapılandırmada:

  • table.include.list: Debezium’un yalnızca public.outbox tablosunu izlemesini sağlıyor.
  • transforms.unwrap: Kafka’ya yalnızca new state mesajlarını göndermek için kullanılan bir dönüşüm sağlar.

3.3 Debezium Connector’u Kafka Connect’e Ekleme

Bu komutla Debezium’a yeni bir outbox-connector eklemiş olursunuz. localhost:8083 Debezium Connect’in varsayılan portudur.

Sonuç

Debezium, Outbox Pattern’i uygulamak için güçlü bir alternatif sunar. Servis katmanında ek bir mesaj işleyiciye ihtiyaç duymadan, veritabanı değişikliklerini doğrudan Kafka’ya iletir. Bu yaklaşım, özellikle büyük ölçekli sistemlerde ek yükleri azaltabilir.

 

Kaynak;

  • https://debezium.io/documentation/reference/stable/operations/monitoring.html
  • https://www.baeldung.com/cs/outbox-pattern-microservices

 

Faydalı olması dileğiyle.

Email adresiniz yayınlanmayacaktır.