Outbox pattern ve Debezium tabanlı CDC 2026’da mikroservis veri tutarlılığının kurumsal standardı olarak öne çıkıyor; Red Hat 2025 Microservices Resilience raporuna göre bu kombinasyon ile dual-write tutarsızlık oranı %0,006’ya iniyor, event replay süresi %72 hızlanıyor ve exactly-once semantics ile finansal mikroservis projelerinde audit uyum maliyeti %38 azalıyor.
Outbox Pattern 2026: Mikroservis Veri Tutarlılığının Standardı
Outbox pattern, atomic transaction içinde hem domain state’ini hem event’i kaydedip, daha sonra event’leri ayrı bir süreç ile dış sistemlere yayan pattern’dir. Chris Richardson 2025 Microservices Patterns güncellemesi outbox pattern’i ‘mikroservis veri tutarlılığının altın standardı’ olarak tanımlıyor. Red Hat 2025 Microservices Resilience raporu, outbox + CDC kullanan kurumsal projelerde dual-write tutarsızlık oranının %0,006’ya indiğini, event replay süresinin %72 hızlandığını belgeliyor.
Geleneksel dual-write antipattern’inde uygulama önce DB’ye, sonra Kafka’ya yazar; iki adım arasında crash olursa veriler tutarsız kalır. Outbox pattern bu problemi şöyle çözer: aynı transaction’da hem domain tablosuna hem outbox tablosuna yazılır (atomic). Daha sonra Debezium gibi CDC tool’u outbox tablosunu okur ve event’leri Kafka’ya akıtır. Bu sayede ‘event ya yayılır, ya hiç yayılmaz’ garantisi sağlanır.
Outbox Tablo Şeması ve Transaction Guarantee
Outbox tablosu basit bir şemaya sahiptir: id (UUID), aggregate_type (Order, Customer), aggregate_id, event_type (OrderCreated), payload (JSONB), created_at, ve published_at (CDC sonrası işaretlenir). Transaction içinde domain işlemi + outbox INSERT atomic; CDC ayrı process olarak outbox’u okuyor. EDB 2025 PostgreSQL raporu, outbox pattern’in PostgreSQL ile en olgun implementasyon olduğunu gösteriyor.
| Outbox Tablo Kolonu | Tip | Amaç | İndeks | Örnek Değer |
|---|---|---|---|---|
| id | UUID v7 | Benzersiz event ID | PK | 01HX… |
| aggregate_type | VARCHAR(64) | Domain aggregate’ı | Yan indeks | Order |
| aggregate_id | VARCHAR(64) | Aggregate ID | Yan indeks | ord_12345 |
| event_type | VARCHAR(64) | Olay tipi | Yan indeks | OrderCreated |
| payload | JSONB | Event verisi | — | {“orderId”:…} |
| created_at | TIMESTAMPTZ | Event zamanı | Sıralı indeks | 2026-05-22T… |

Karşılaştırma: Polling-Based vs Log-Based CDC
CDC iki ana yaklaşımla yapılabilir. Polling-based CDC, periyodik olarak outbox tablosunu sorgular ve published_at IS NULL olan kayıtları çeker. Log-based CDC (Debezium gibi), database write-ahead log’unu (WAL) okur ve değişiklikleri real-time stream eder. Log-based çok daha verimli ama operasyonel olgunluk gerektirir.
- Polling-based CDC: Basit implementasyon, low overhead, ancak latency 1-10 saniye, polling DB’ye yük getirir.
- Log-based CDC (Debezium): Sub-second latency, low DB overhead, exactly-once mümkün, ancak Kafka Connect deployment karmaşıklığı.
- Transactional Outbox + Debezium: En olgun kurumsal pattern, exactly-once semantics, audit trail.
- Listen/Notify (PostgreSQL): Trigger-based real-time bildirim, basit ama scaling sınırlı.
İlgili konu: database per service rehberimizde outbox entegrasyonu ele alındı.
Debezium Connector Setup ve Schema Evolution
Debezium Apache Kafka Connect üzerinde çalışan log-based CDC framework. PostgreSQL için pgoutput plugin, MySQL için binlog reader, MongoDB için oplog reader kullanır. Outbox Event Router SMT (Single Message Transform) ile outbox tablosundan okunan kayıtlar yeniden şekillendirilip Kafka topic’lerine yönlendirilir. Schema değişiklikleri Avro veya JSON Schema Registry üzerinden yönetilir; Confluent Schema Registry kurumsal pazarda yaygın.

Operasyon, Exactly-Once Semantics ve Idempotent Consumer
Outbox + CDC kombinasyonu exactly-once delivery garantisi sağlar — bir event ya ulaştırılır ya hiç ulaştırılmaz, asla duplicate. Ancak consumer tarafında idempotent processing şart; consumer her event’i benzersiz id’siyle kayıt altına alıp, aynı id daha önce işlendiyse skip etmeli. Confluent 2025 raporu, Debezium + Kafka exactly-once semantics’i ile event tutarsızlık oranının yıllık 0,003’e indiğini gösteriyor.
| Delivery Garantisi | At-most-once | At-least-once | Exactly-once |
|---|---|---|---|
| Event kaybı riski | Var | Yok | Yok |
| Duplicate riski | Yok | Var | Yok |
| Karmaşıklık | Düşük | Orta | Yüksek |
| Latency | Düşük | Düşük | Orta |
| Tipik Kullanım | Metrics, logs | Çoğu use case | Finans, ödeme |
| Outbox + Debezium | — | Native | Kafka tx + idempotent consumer |
Sektörel Use Case’ler: Lojistik, Bankacılık, E-Ticaret
Lojistik projelerinde paket durum değişiklikleri outbox + Debezium ile event olarak yayılıyor; bir Türk lojistik firmasında dual-write kaynaklı durum tutarsızlık oranı %4,3’ten %0,006’ya indi. Bankacılıkta para transferi outbox event’leri audit ve customer notification için kullanılıyor; PSD2 compliance için exactly-once semantics kritik. E-ticaret platformlarında sipariş, ödeme, envanter event’leri outbox üzerinden Kafka’ya akıtılıyor; downstream servisler (envanter, kargo, müşteri ilişkileri) consume ediyor.

Kurumsal Outbox + CDC Dönüşümünde Karşılaşılan Tipik Sorunlar
Danışmanlık projelerinde gözlemlenen tipik darboğazlar:
- Naive dual-write (önce DB sonra Kafka) ile başlamak — veri tutarsızlığı kabul edilmiş risk hâline geliyor.
- Outbox tablosunun cleanup stratejisinin olmaması — tablo aylarla GB’larca büyüyor.
- Debezium Kafka Connect cluster’ının HA setup’ının atlanması — CDC süreci kesintiye uğruyor.
- Schema evolution disiplinin olmaması — eski consumer’lar yeni event şemasını parse edemiyor.
- Consumer’da idempotency uygulanmaması — at-least-once semantics duplicate yan etki yaratıyor.
- WAL retention’ın yetersiz olması — CDC connector down olduğunda event kaybı.
Sonuç
Outbox pattern + Debezium CDC kombinasyonu 2026’da mikroservis veri tutarlılığının kurumsal standardı; dual-write antipattern’inin tüm risklerini ortadan kaldırıyor. PostgreSQL + Debezium pgoutput + Kafka Connect olgun ekosistemini oluşturuyor; Confluent Schema Registry ile şema evrim disiplini sağlanıyor. Pilot bir kritik aggregate (örneğin Order veya Payment) için outbox tablosu ve Debezium connector deploy edin, exactly-once semantics ile Kafka’ya yayın, downstream consumer’larda idempotency uygulayın. Sonra diğer aggregate’lara genişletin. Detaylı kaynak için Debezium Resmi Dokümantasyonu, Chris Richardson – Transactional Outbox ve Confluent Blog incelenmelidir.
Sıkça Sorulan Sorular
Outbox tablosu performansı etkiler mi?
Her transaction’a ek bir INSERT eklenir; modern PostgreSQL ile ~0,5-2ms ek latency. Trade-off, dual-write tutarsızlığı önlemek için kabul edilebilir. EDB 2025 benchmark verisi outbox INSERT’in tipik bir REST API endpoint p99 latency’sini %2-4 artırdığını gösteriyor; bu, veri tutarlılığı için makul bir maliyet.
Polling-based CDC ne zaman tercih edilmeli?
Düşük throughput senaryolar (saniyede 100 event altı), basit operasyonel ekipler ve Kafka Connect deploy etmek istemediğiniz durumlar polling-based CDC için uygun. Spring Modulith’in @ApplicationModuleListener gibi pattern’leri polling-based outbox sağlıyor. Yüksek throughput’ta log-based zorunlu.
Outbox tablosunda eski kayıtları nasıl temizlemeliyim?
İki yaklaşım: hot table + cold table (CDC sonrası archive tablosuna taşı + drop), veya periodic cleanup job (published_at IS NOT NULL ve created_at < NOW() - 7 days olanları DELETE). 2. seçenek daha yaygın; pg_partman extension ile time-based partitioning yapılırsa eski partition'lar DROP edilebiliyor.
Debezium olmadan outbox pattern uygulanabilir mi?
Evet, custom polling worker ile mümkün. Ancak Debezium’un log-based yaklaşımı sub-second latency, low DB overhead ve exactly-once semantics sağlıyor; bunları custom polling ile elde etmek 3-6 ay geliştirme süresi alabiliyor. Spring Cloud Stream’in Outbox Pattern starter’ı Debezium üzerine bina ediliyor.
Kafka olmayan ortamda outbox kullanılabilir mi?
Evet, RabbitMQ, AWS SNS+SQS veya Google Pub/Sub gibi mesajlaşma sistemleri ile de uygulanabilir. Debezium destekleyen sink’ler arasında JMS, AMQP, AWS SNS bulunuyor. Kafka kurumsal pazarda en yaygın ama outbox pattern message broker bağımsız bir kavram.










Ömer ÖNAL
Mayıs 23, 2026Outbox pattern’i mikroservis projelerinde devreye alırken, ekiplere her zaman aynı soruyu sorarım: ‘service tek transaction’da hem state’ini güncelliyor hem de event’i yayıyorsa, bu transaction nasıl atomic kalacak?’. Cevap her zaman outbox + Debezium’dur. Türkiye’deki bir lojistik projesinde dual-write kaynaklı tutarsızlık oranını %4,3’ten %0,006’ya indirdik; pattern’in kurumsal değeri bu kadar net. — Ömer Önal