TB
← Tüm yazılar

Event-driven düşünmek

Olay gudumlu mimari yaklasimin temellerini, mesajlasma desenleri ve asenkron iletişim stratejilerini inceliyoruz.

Event-driven architecture (EDA), sistem bilesenlerinin olaylar uzerinden gevsek bağlı şekilde iletişim kurmasini hedefler. Bir servis bir sey oldugunda olay yayinlar; ilgilenen taraflar bu olaya abone olur ve kendi islemlerini tetikler. Bu model ölçeklenebilirlik, esneklik ve bagimsiz evrim sağlar ancak eventual consistency, debug zorlugu ve operasyonel karmasiklik getirir.

Olay, komut ve sorgu ayrimi

Event gecmis zamanda olmus bir seyi bildirir: OrderPlaced, PaymentReceived. Komut bir eylem talep eder: PlaceOrder, ChargePayment. Sorgu veri ister, yan etki birakmaz. Event-driven düşünmek event'leri birincil entegrasyon mekanizmasi olarak konumlandirmaktir.

  • Domain event: Ayni bounded context icinde, aggregate yaşam dongusu icinde.
  • Integration event: Context'ler veya servisler arasi.
  • Notification event: Bilgilendirme amacli, zorunlu tuketici yok.

Mesajlasma desenleri

Point-to-point queue bir mesaji tek tuketici isler. Publish-subscribe topic birden fazla aboneye iletir. Event streaming (Kafka) olaylari log'da tutar, tuketici offset ile ilerler. Seçim throughput, ordering ve replay gereksinimine baglidir.

Ordering ve partitioning

Ayni aggregate ID'ye ait event'lerin sırası korunmali ise partition key aggregate ID olur. Global ordering nadiren gerekir ve maliyetlidir. Idempotent consumer tasarımı at-least-once delivery icin zorunludur.

await producer.ProduceAsync("orders", new Message
{
    Key = orderId.ToString(),
    Value = new OrderPlacedEvent(orderId, total)
});

Eventual consistency

Event-driven sistemlerde anlik tutarlılık her yerde garanti edilmez. Okuyucu gecikmeli guncellenmis veri gorebilir. UX bu gercegi yansitmali: 'Odeme isleniyor' durumu, optimistic UI veya polling. Saga pattern uzun suren is akislarinda tutarlılığı sağlar.

Outbox pattern

Veritabanı yazimi ve event yayini atomik degildir; outbox tablosu çözüm sunar. Işlem outbox kaydi ile birlikte commit edilir; ayri dispatcher outbox'tan okuyup broker'a gonderir. Bu desen cift yazma ve kayıp event riskini azaltir.

BEGIN TRANSACTION;
INSERT INTO orders ...;
INSERT INTO outbox (event_type, payload) VALUES (...);
COMMIT;
-- Background worker publishes from outbox

Idempotency ve exactly-once illuzyonu

Gerçek dunyada exactly-once delivery pahali ve nadir gereklidir. Pratik hedef: at-least-once delivery + idempotent handler. Tuketici event ID veya is anahtarini kaydederek tekrar islemeyi atlar.

Event schema evrimi

Event sozlesmeleri versiyonlanir. Yeni alan eklemek backward compatible'dir. Alan silme veya tip degisimi breaking change gerektirir. Schema registry (Avro, Protobuf, JSON Schema) uyumluluk kontrolu sağlar. Upcaster ile eski event yeni modele donusturulur.

CQRS ve event sourcing iliskisi

Event sourcing durumu event log'undan turetir; EDA ile dogal ortaktir ancak zorunlu degildir. CQRS okuma modelini event projection ile gunceller. Bu kombinasyon güçlü ama operasyonel olarak agir; ihtiyaç olmadan benimsenmemeli.

Projection ve read model

Event handler okuma modelini gunceller. Projection gecikmesi okuma tarafinda lag uretebilir. Read model eventual olarak tutarlı hale gelir.

Hata yönetimi ve dead letter

Başarısız tüketim retry ile tekrarlanir. Max retry sonrasi dead letter queue'ya tasinir. Operasyon ekibi DLQ'yu inceler ve yeniden isler veya iptal eder. Poison message tek mesajin tüm kuyrugu bloklamasi onlenmelidir.

  1. Transient hata: exponential backoff retry
  2. Kalıcı hata: DLQ + alarm
  3. Is kurali hatasi: compensation veya manual mudahale
  4. Sürüm uyumsuzlugu: schema fix ve replay

Gozlemlenebilirlik

Distributed trace event publish ve consume span'lerini baglar. Correlation ID tüm mesajlarda tasınir. Metrik: publish rate, consumer lag, DLQ depth, processing latency. Event-driven sistemde debug icin event log replay kritik aractir.

Güvenlik

Topic ve queue erişim kontrolu, mesaj sifreleme, PII maskeleme event payload'inda dusunulmelidir. Event bus'a yetkisiz publish onlenmelidir. Audit trail icin immutable event log tercih edilebilir.

Monolit icinde event-driven

EDA mikroservis gerektirmez. In-process domain event MediatR notification ile yayinlanabilir. Modül monolitte integration event message broker veya outbox ile dışarı acilir. Basit baslangic icin in-process yeterli olabilir.

Saga ve uzun suren işlemler

Siparis-odeme-stok akisi birden fazla servisi kapsar. Choreography saga her servis kendi event'ine tepki verir. Orchestration saga merkezi koordinator yönetir. Compensating transaction geri alma adimlarini tanimlar.

Test stratejisi

Contract test event schema uyumunu dogrular. Integration test test container broker ile çalışır. Consumer birim testi handler mantigini mock olay ile test eder. Chaos test broker kesintisi davranisini olcer.

Yaygın hatalar

Event'i komut gibi kullanmak (bidirectional coupling). Cok büyük payload. Senkron beekleme event zincirinde. Outbox olmadan dual write. Global ordering varsayimi. Idempotency ihmal.

Karar cercevesi

Event-driven düşünmek su durumlarda deger üretir: bagimsiz ekip/servis evrimi, yüksek yazma throughput, çoklu tuketici, audit ve replay ihtiyaci. Basit CRUD ve tek monolit ekibinde senkron API ve domain event yeterli olabilir. Geçiş kademeli yapilmali; once domain event, sonra outbox, sonra broker.

Özet

Olay gudumlu mimari gevsek baglilik ve ölçeklenebilirlik sunar; eventual consistency, idempotency ve operasyonel gozlemlenebilirlik bedelidir. Outbox, schema versioning, DLQ ve trace olmadan uretime cikmak risklidir. Doğru desen seçimi is gereksinimine dayanmali, moda olduğu icin degil.

Üretim ortaminda mimari disiplin

Mimari kararlar yalnizca tasarım dokumaninda kalmamali; CI pipeline, code review checklist ve otomatik analiz araclari ile gunluk geliştirme akisina gomulmelidir. Bağımlılık ihlali, modül sınırı asimi veya katman ihlali iceren pull request'ler merge edilmeden once duzeltilmelidir. Bu disiplin olmadan en iyi diyagramlar bile zamanla erozyona ugrar.

Metrikler ve geri bildirim

Modül basina değişim sikligi, test coverage, cyclomatic complexity ve build sure metrikleri mimari sagligi gösterir. Ani complexity artisi veya test coverage dususu refactoring ihtiyacinin sinyalidir. Teknik liderlik bu metrikleri sprint review'da is degeri ile birlikte degerlendirmelidir.

Incident post-mortem'lerinde kok neden analizi mimari sınırları da kapsamali. Cross-modül veya cross-layer coupling iceren hatalar ADR veya mimari backlog'a donusturulmelidir. Tekrarlayan ihlaller otomatik lint kurallari ile onlenir.

Üretim ortaminda mimari disiplin

Mimari kararlar yalnizca tasarım dokumaninda kalmamali; CI pipeline, code review checklist ve otomatik analiz araclari ile gunluk geliştirme akisina gomulmelidir. Bağımlılık ihlali, modül sınırı asimi veya katman ihlali iceren pull request'ler merge edilmeden once duzeltilmelidir. Bu disiplin olmadan en iyi diyagramlar bile zamanla erozyona ugrar.

Metrikler ve geri bildirim

Modül basina değişim sikligi, test coverage, cyclomatic complexity ve build sure metrikleri mimari sagligi gösterir. Ani complexity artisi veya test coverage dususu refactoring ihtiyacinin sinyalidir. Teknik liderlik bu metrikleri sprint review'da is degeri ile birlikte degerlendirmelidir.

Incident post-mortem'lerinde kok neden analizi mimari sınırları da kapsamali. Cross-modül veya cross-layer coupling iceren hatalar ADR veya mimari backlog'a donusturulmelidir. Tekrarlayan ihlaller otomatik lint kurallari ile onlenir.

Üretim ortaminda mimari disiplin

Mimari kararlar yalnizca tasarım dokumaninda kalmamali; CI pipeline, code review checklist ve otomatik analiz araclari ile gunluk geliştirme akisina gomulmelidir. Bağımlılık ihlali, modül sınırı asimi veya katman ihlali iceren pull request'ler merge edilmeden once duzeltilmelidir. Bu disiplin olmadan en iyi diyagramlar bile zamanla erozyona ugrar.

Metrikler ve geri bildirim

Modül basina değişim sikligi, test coverage, cyclomatic complexity ve build sure metrikleri mimari sagligi gösterir. Ani complexity artisi veya test coverage dususu refactoring ihtiyacinin sinyalidir. Teknik liderlik bu metrikleri sprint review'da is degeri ile birlikte degerlendirmelidir.

Incident post-mortem'lerinde kok neden analizi mimari sınırları da kapsamali. Cross-modül veya cross-layer coupling iceren hatalar ADR veya mimari backlog'a donusturulmelidir. Tekrarlayan ihlaller otomatik lint kurallari ile onlenir.