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.
- Transient hata: exponential backoff retry
- Kalıcı hata: DLQ + alarm
- Is kurali hatasi: compensation veya manual mudahale
- 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.