Her post-it rengi farkli bir anlam tasir. Oklar ise "kim kimi tetikliyor, nasil" sorusunu yanitlar.
Normal akis: Insan bir sey yapmak ister → Command gonderir → Event olusur.
Policy akisi: Event olusur → Policy OTOMATIK tetiklenir → yeni Event veya Command olusur.
Aradaki fark: policy zincirinde kullanici YOK. Sistem kendi kendine karar veriyor. Bu yuzden ok KESIKLI ciziliyor — "bu adim otomatik, biri tiklamadi" anlami tasiyor.
Policy = kodda nereye denk dusuyorlar?
• BullMQ delayed job (zamanlayici policy'ler) → asyncEventBus.emit('...', payload, { delay: 600000 })
• Sync event handler (aninda policy'ler) → syncEventBus.on('reservation.created', handler)
• Entity icindeki if-then (is kurali policy'ler) → if (status !== 'PENDING') throw
Herkes duvara turuncu post-it yapiyor: "Sistemde ne OLDU?" Siralama yok, gruplama yok.
Event'leri soldan saga zaman sirasina diz.
Her event'e soralim: "Bunu KIM tetikledi? NASIL?" Oklara dikkat — kesikli mor = otomatik (policy), duz mavi = insan tetikli.
Duvardaki post-it'lere bak ve GRUPLAMA yap. "Hangi event'ler birlikte degisiyor?" — Kartlara tikla → klasor yapisi, post-it esleme, haberlesmeler
| Kimden | Kime | Tip | Mekanizma | Neden bu tip? |
|---|---|---|---|---|
| Booking | Pricing | SYNC | Fonksiyon cagrisi | Fiyat bilgisi ANINDA lazim |
| Booking | Pricing | ASYNC | BullMQ event | "Talep degisti, fiyati yeniden hesapla" |
| Booking | Payment | SYNC | Fonksiyon cagrisi | Odeme sonucu ANINDA lazim |
| Booking | Ticketing | ASYNC | BullMQ event | QR uretimi uzun surebilir |
| Booking | Notification | ASYNC | BullMQ event | Email 2sn surur, bekletme |
| Any | Identity | SYNC | JWT middleware | Her istek kimlik dogrulamasi gerektirir |
| Event Catalog | Venue | SYNC | DB foreign key | Etkinlik mekana aittir |
| Hot Spot | Tartisma | Karar | Koda Yansimasi |
|---|---|---|---|
| Ayni koltuğa 500 kisi? | DB lock mu? App lock mu? | Redis distributed lock (Redlock) | acquireSeatLock() |
| 10dk doldu ama odeme tam o anda? | Race condition | Optimistic concurrency + sessiz donme | reservation.expire() |
| Ayni odeme 2 kez? | Network timeout → retry | Idempotency-Key + Redis cache | idempotencyGuard |
| Stripe cokerse? | 30sn timeout × 1000 istek | Circuit breaker | CircuitBreaker |
| Fiyat neden degisti? | Musteri sikayeti, regulasyon | Append-only event log | pricing_events |
| Sahte QR bilet? | Fotokopi, manipulasyon | HMAC-SHA256 + constant-time | generateQRPayload() |
| Karaborsaci 100 bilet? | Scalping | Kullanici basina max 6 | MAX_SEATS_PER_BOOKING |
| 2 saat kala iptal? | Organizator zarar eder | 48 saat kurali | CANCELLATION_DEADLINE |