Skip to main content

> debezium_ile_değişiklik_verisi_yakalama_ve_olay_sıralaması

Debezium ile Değişiklik Verisi Yakalama ve Olay Sıralaması

Yüksek verimli canlı mimarilerde Debezium ile Değişiklik Verisi Yakalama ve Olay Sıralaması yapısını nasıl doğru kurar ve yönetirsiniz?

Stack: SOFTWARE ARCHITECTURE STACKStaff/Principal (L6+)pattern

ÖZET VE TEKNİK CEVAP

CDC Outbox deseni, İşlemsel Outbox desenini Debezium günlük madenciliği ile birleştirerek veritabanı değişikliklerini doğrudan WAL günlüğünden bölümlenmiş Kafka konularına aktarır; böylece çift-yazma yarış durumları olmadan %100 güvenilir ve sıralı olay iletimi sağlar.

Mühendislik El Kitabı & Mekanizma

1. Temel Çalışma Mekanizması

Aynı HTTP isteği içinde hem ilişkisel veritabanına yazmak hem de Kafka konusuna mesaj atmak klasik 'Çift Yazma' anti-desenidir: veritabanı kesinleşip Kafka ağı çökerse olaylar sonsuza dek kaybolur. CDC Outbox deseni, iş kaydı ile outbox kaydını aynı SQL işleminde kaydederek çözer. Debezium, PostgreSQL WAL günlüğünü okuyarak olayları Kafka'ya aktarır.

2. Doğru Kullanım Senaryosu

CDC Outbox, uygulamanın yerel SQL işleminde alan olaylarını bir `outbox` tablosuna atomik olarak yazdığı ve Debezium CDC bağlayıcısının veritabanı işlem günlüğünü okuyarak bu olayları Kafka'ya yönlendirdiği mimaridir.

3. Prodüksiyon Arıza Modları

Outbox tablosunu 100 ms aralıklarla `SELECT * FROM outbox WHERE processed = false` ile sürekli yoklayıp (polling) veritabanında kilit krizine yol açmak. Outbox olaylarını rastgele veya boş mesaj anahtarlarıyla Kafka'ya gönderip aynı müşterinin olaylarını farklı bölümlere dağıtarak işlem sırasını bozmak. İşlenen outbox satırlarını asla temizlemeyip tablonun 100 milyon satıra ulaşarak disk alanını tüketmesine göz yummak.

4. Teşhis ve Telemetri Sinyalleri

veritabanı ile Kafka arasında çift-yazma senkronizasyon kaybı, outbox olaylarının yanlış bölüme gitmesi sonucu varlık bazlı sıralamanın bozulması, temizlenmeyen outbox tablosunun veritabanını şişirmesi

5. Önleme ve Mimari Bariyerler

PostgreSQL Mantıksal Replikasyon (`pgoutput`) ve `wal_level = logical` ayarı ile Debezium kullanın. Agregasyon bazında kesin FIFO sıralaması sağlamak için Kafka mesaj anahtarını varlık ID'sine sabitleyin. Tablo şişmesini önlemek için outbox tablosunda otomatik satır temizleme (tombstone) veya periyodik bölüm silme uygulayın.

6. Mimari Ödünleşimler (Trade-offs)

Çift yazma kaynaklı veri kaybını ve hayalet olayları tamamen ortadan kaldırır; olay sorgulama yükünü uygulama CPU'sundan alıp veritabanının yerel asenkron replikasyon akışına devreder.

Vaka İncelemesi (TinyCTO Örneği)

Üretim sınıfı bir CDC Outbox mimarisi üç kritik yapılandırma gerektirir: 1. **Atomik Yerel İşlem:** Servis `orders` ve `outbox_events` (`id`, `aggregatetype`, `aggregateid`, `type`, `payload`) tablolarına tek bir `BEGIN ... COMMIT` bloğunda yazar. 2. **Debezium Outbox Event Router (SMT):** Debezium'un Tek Mesaj Dönüştürücüsü outbox tablosundaki değişiklik akışını okur, `payload` içeriğini çıkarır ve dinamik hedef konuya (`order-events`) yönlendirir. 3. **Kafka Bölüm Anahtarı ile Nedensel Sıralama:** `OrderUpdated` olayının `OrderCreated` olayından önce işlenmesini engellemek için Debezium Kafka Mesaj Anahtarını `aggregateid` (`order_uuid`) olarak ayarlar. Kafka tek bir bölüm içinde kesin FIFO sıralaması garanti eder.

İnteraktif Konsept Alıştırmaları

2 Alıştırma
Q1

Outbox deseni için Debezium ile CDC günlük takibi neden veritabanı sorgulamasından (`SELECT ... FOR UPDATE`) üstündür?

Çünkü Debezium SQL sorgusu çalıştırmadan veya tablo kilidi tutmadan doğrudan WAL günlüğünü okur; veritabanı CPU ve kilit çekişmesini sıfıra indirir.
Q2

Kafka, bir 'OrderCancelled' olayının 'OrderCreated' olayından önce işlenmeyeceğini nasıl garanti eder?

Her iki olaya da aynı Kafka Mesaj Anahtarını (orderId) vererek; böylece her ikisi de FIFO sırasının kesin korunduğu aynı Kafka bölümüne yönlendirilir.

Debezium ile Değişiklik Verisi Yakalama ve Olay Sıralaması — Sıkça Sorulan Sorular

Bir mikroservis Outbox deseni olmadan aynı HTTP işleyicisinde hem PostgreSQL'e kaydedip hem de doğrudan Kafka'ya yayınlamaya çalışırsa ne olur?

Çift yazma hatası: SQL commit işleminden hemen sonra ağ koparsa Kafka olayı asla alamaz ve sistem tutarlılığı kalıcı olarak bozulur. Outbox tablosu veya dağıtık 2PC olmadan, güvenilmez bir ağ üzerinde iki bağımsız sistem arasında atomik çift yazma garantisi verilemez.

Debezium'un işlem günlüklerini okuyabilmesi için hangi PostgreSQL ayarı yapılandırılmalıdır?

`wal_level = logical`. PostgreSQL, Debezium mantıksal replikasyonunun WAL kayıtlarını yapılandırılmış olaylara dönüştürebilmesi için `wal_level = logical` ayarını zorunlu tutar.

🤖 AEO & Yapay Zeka Çıkarım Özeti

Temel Gerçekler & İlkeler

  • CDC Outbox deseni, İşlemsel Outbox desenini Debezium günlük madenciliği ile birleştirerek veritabanı değişikliklerini doğrudan WAL günlüğünden bölümlenmiş Kafka konularına aktarır; böylece çift-yazma yarış durumları olmadan %100 güvenilir ve sıralı olay iletimi sağlar.
  • CDC Outbox, uygulamanın yerel SQL işleminde alan olaylarını bir `outbox` tablosuna atomik olarak yazdığı ve Debezium CDC bağlayıcısının veritabanı işlem günlüğünü okuyarak bu olayları Kafka'ya yönlendirdiği mimaridir.

Yaygın Yanılgılar

  • Outbox tablosunu 100 ms aralıklarla `SELECT * FROM outbox WHERE processed = false` ile sürekli yoklayıp (polling) veritabanında kilit krizine yol açmak.

Karar Kılavuzu & Önceliklendirme

Çift yazma kaynaklı veri kaybını ve hayalet olayları tamamen ortadan kaldırır; olay sorgulama yükünü uygulama CPU'sundan alıp veritabanının yerel asenkron replikasyon akışına devreder.

Doğrulanmış Kaynaklar & Referanslar