Olay mimarisi
Etkinlik Mimarisi (EDA)
1) Etkinlik nedir ve neden EDA
Olay - etki alanında zaten meydana gelen değişmeyen bir gerçek ("PlayerVerified", "PaymentCaptured"). EDA, bu gerçeklerin yayınlanması ve bunlara verilen tepkiler etrafında entegrasyonlar oluşturur:- Hizmetlerin zayıf bağlanabilirliği,
- Tüketicileri bağımsız olarak ölçeklendirmek,
- Projeksiyonların yeniden oynatılması/düzenlenmesi,
- şeffaf denetim.
EDA, senkronize API'leri iptal etmez - çapraz hizmet bağımlılıklarını asenkron katmana getirerek tamamlar.
2) Olay türleri
Etki alanı: önemli iş gerçekleri (OrderPlaced, BonusGranted).
Entegrasyon: "Anlık görüntüler "/harici sistemler için değişiklikler (UserUpdated, WalletBalanceChanged).
Teknik: yaşam döngüsü ve telemetri (Kalp atışı, PipelineFailed).
Komutlar (olaylar değil, yakınlarda): "Do X" (CapturePayment) talimatları.
Öneri: domain olayları önceliklidir; Entegrasyon, belirli tüketiciler için projeksiyonlarla oluşturulur.
3) Etkinlik sözleşmeleri ve şemaları
Схема: Avro/Protobuf/JSON Schema + Schema Registry; Uyumluluk stratejisi: Tüketici evrimi için 'GERIYE', kritik konularda 'TAM'.
CloudEvents (id, source, type, time, subject, datacontenttype) - tekdüze başlıklar.
Gerekli meta veriler: 'event _ id' (ULID/UUID), 'occurred _ at', 'producer', 'schema _ version', 'correlation _ id'/' causation _ id', 'idempotency _ key'.
Sürüm oluşturma: yalnızca eklenti alanları, yeniden adlandırma yasağı/anlamsal kesmeler; Yeni tipler - yeni temalar/tipler.
json
{
"type":"record","name":"PaymentCaptured","namespace":"events.v1",
"fields":[
{"name":"event_id","type":"string"},
{"name":"occurred_at","type":{"type":"long","logicalType":"timestamp-micros"}},
{"name":"payment_id","type":"string"},
{"name":"amount","type":{"type":"bytes","logicalType":"decimal","precision":18,"scale":2}},
{"name":"currency","type":"string"},
{"name":"player_id","type":"string"}
]
}
4) Teslimat, sipariş ve tutarlılık
Varsayılan olarak en az bir kez - işleyici idempotency gereklidir.
Sipariş: Bir parti (Kafka) veya sıra (RabbitMQ) içinde garanti edilir, ancak geri çekilmelerle kırılabilir; Olay anahtarı, sipariş edilen bir etki alanı granülünü yansıtmalıdır (örneğin, 'player _ id').
Tutarlılık: para/krediler için - sadece dergiler/destanlar/tazminat yoluyla; LWW'den kaçının.
Okuma modeli: Projeksiyonlar ve önbellekler nihai olabilir - "güncelleme devam ediyor"... ve sıkı yollar için RNOT stratejilerini kullanın.
5) Giden Kutusu/Gelen Kutusu и CDC
Giden kutusu: hizmet, veritabanına ve bir işlemdeki giden kutusu tablosuna bir gerçek yazar - işçi veri yoluna yayınlar.
Gelen kutusu: Tüketici, veri tekilleştirme için 'event _ id' işlem sonucunu depolar.
CDC (Change Data Capture): Uygulama değişiklikleri olmadan entegrasyonlar oluşturmak için veri tabanından (binlog/WAL) veri yoluna değişiklik akışı.
Idempotency: 'idempotency _ key'/' event _ id'ile işleme, düzeltilene kadar dış dünyayı değiştirmez.
6) CQRS и Etkinlik Kaynağı
CQRS: ayrı yazma modeli ve okuma projeksiyonları; Projeksiyonlar olaylardan inşa edilir ve geride kalabilir.
Event Sourcing: aggregate state = etkinliklerinin toplanması. Artıları: tam denetim/yeniden oynatma; Eksileri: göçlerin/şemaların/anlık görüntülerin karmaşıklığı.
Uygulama: ES - her yerde değil, tarihin ve tazminatın önemli olduğu yerlerde; CQRS - hemen hemen her zaman EDA'da.
7) Sagalar: Orkestrasyon ve Koreografi
Orkestrasyon: Koordinatör komutlar gönderir ve yanıt olaylarını bekler; Karmaşık işlemler için uygun (KYC - Para Yatırma - Bonus).
Koreografi: hizmetler birbirlerinin olaylarına tepki gösterir; Daha kolay ama izini sürmek daha zor.
Her zaman tazminatları ve adım teslim tarihlerini tanımlayın.
8) Topoloji Tasarımı (Kafka/RabbitMQ)
Kafka
Alan adı olayı başına konu: 'ödemeler. yakalandı. v1 ',' oyuncular. doğrulandı. v1 '.
Bölümleme anahtarı: 'player _ id'/' wallet _ id' - siparişin önemli olduğu yerler.
'tekrarı. faktör = 3 ','min. insync. replikalar = 2 ', yapımcı' acks = all '.
Tutma: zamanla (örn. 7-90 gün) ve/veya sıkıştırma (anahtarla son durum).
Geri alma ile yeniden deneme ve DLQ konuları.
RabbitMQ
Borsalar: 'konu'/' doğrudan', yönlendirme anahtarı 'ödemeleri. yakalandı. v1 '.
Geniş bir fan çıkışı için - 'konu' + birkaç kuyruk; RPC/komutlar için - ayrı kuyruklar.
HA için Quorum Kuyrukları; Retrays için TTL + ölü mektup değişimi.
9) Gözlenebilirlik ve SLO EDA
SLI/SLO:- Uçtan uca gecikme (occurred_at - işlenmiş): P50/p95/p99.
- Lag/age: consumer lag (Kafka consumer lag, Rabbit backlog age).
- Verimli yayınlama/işleme.
- DLQ oranı ve tekrarların oranı.
- Ticari işlemlerin başarısı (örn. "depozito onaylandı ≤ 5c").
- Olayların 'trace _ id'/' correlation _ id' (OTel) ile korelasyonu.
- Hizalamadan örnekler - metrikler.
- Yanma oranı uyarıları içeren "Üretici - Broker - Tüketici" panoları.
10) Tekrar oynatma, tutma ve geri doldurma
Projeksiyonları yeniden oluşturmak/hataları düzeltmek için tekrar oynatın: yeni bir projeksiyona/alana sürün, ardından okumayı değiştirin.
Tutma: Yasal/İş Gereksinimleri (GDPR/PCI); hassas alanlar - şifrelemek ve/veya tokenize.
Backfill: Tek seferlik temalar/kuyruklar, prod'u boğmamak için net RPS sınırları.
11) Güvenlik ve uyumluluk
TLS transit, dahili istemciler için mTLS.
Yetkilendirme: konu başına/değişim başına ACL; Ad alanı/vhost aracılığıyla çoklu görev.
PII: olaydaki alanları en aza indirin; zarf meta verileri ayrı ayrı, gerekirse şifrelenmiş yükler.
Olaylara erişimi denetleyin,'çok güçlü "anahtarları yasaklayın.
Saklama ve Silme Hakkı (GDPR) politikaları: veri referanslarını veya mezar taşı olaylarını depolar ve projeksiyonlarda siler.
12) EDA'da test
Sözleşme testleri: Tüketiciler plan beklentilerini doğrular (tüketici odaklı).
Yeniden oynatma testleri: yeni bir işleyici/şema sürümü aracılığıyla geçmiş örneklemeyi çalıştırın.
Kaos senaryoları: broker gecikme/kayıp, düğüm düşüşü, tüketici gecikmesi - SLO içinde kalır.
Smoke in CI: Zaman temaları üzerine uçtan uca kısa bir boru hattı.
13) "CRUD entegrasyonlarının göçü - EDA"
1. Etki alanı gerçeklerini tanımlayın.
2. Giden kutusunu kaynak hizmetlere gömün.
3. Minimum etki alanı olayları yayınlayın ve 1-2 projeksiyon bağlayın.
4. Nokta eşzamanlı entegrasyonları kademeli olarak devre dışı bırakın, bunları aboneliklerle değiştirin.
5. Schema Registry ve bir uyumluluk politikası yazın.
6. Yalnızca eklenti etkinliklerini alanlarla genişletin; kırılmalar - sadece yeni türler aracılığıyla.
14) Anti-desenler
Olaylar = "DTO API" (çok şişman, dahili modele bağlı) - tüketicileri kırın.
Şema Kayıt Defteri ve uyumluluk eksikliği - "kırılgan" entegrasyonlar.
Koddan yayınlama ve veritabanına yazma atomik değildir (giden kutusu yoktur) - olayları kaybedersiniz.
"Tam olarak-her yerde bir kez" - faydasız yüksek fiyat; Daha iyi-en-az-bir kez + idempotency.
Bir "evrensel" bölüm anahtarı - sıcak bir bölüm.
Doğrudan üretim projeksiyonuna tekrar oynatın - çevrimiçi SLO'ları kırar.
15) Uygulama kontrol listesi (0-45 gün)
0-10 gün
Etki alanı olaylarını ve anahtarlarını (sipariş granülleri) tanımlayın.
Schema Registry'yi dağıtın ve uyumluluk stratejisini onaylayın.
1-2 hizmete giden kutu/gelen kutusu ekleyin; Minimal CloudEvents-envelope.
11-25 gün
Retry/DLQ, backoff, idempotency of handlers bilgilerini girin.
Panolar: gecikme/yaş/uçtan uca; yanma oranı uyarıları.
Olay dokümantasyonu (katalog), sahipler ve şema inceleme süreçleri.
26-45 gün
İlk projeksiyonun yeniden oynatılması/düzenlenmesi; Runbook replay ve backfill.
Güvenlik politikaları (TLS, ACL, PII), saklama, GDPR prosedürleri.
Komisyoncu ve tüketiciler için düzenli kaos ve oyun günleri.
16) Olgunluk metrikleri
Etki alanı olaylarının %100'ü şemalar tarafından tanımlanır ve kaydedilir.
Giden kutusu/gelen kutusu tüm Tier-0/1 üreticileri/tüketicileri kapsar.
SLO: p95 uçtan uca gecikme ve %99 ≥ hedefler dahilinde tüketici gecikmesi.
Tekrar oynatma/Geri doldurma, kesinti olmadan mümkündür; doğrulanmış runbooklar var've.
Sürüm oluşturma: yeni alanlar - kırılmadan; Eski tüketiciler düşmüyor.
Güvenlik: TLS + mTLS, konu başına ACL, erişim günlükleri, PII/saklama politikası.
17) Mini snippet'ler
Kafka Producer (güvenilir yayın, fikirler):properties acks=all enable.idempotence=true max.in.flight.requests.per.connection=1 compression.type=zstd linger.ms=5
Tüketici işleyicisi (idempotency, pseudocode):
python if inbox.contains(event_id): return # дедуп process(event) # побочные эффекты детерминированы inbox.commit(event_id) # atomically with side-effect commit_offset()
RabbitMQ DLX ile Yeniden Deneme (fikir):
- 'queue: tasks' - nack> DLX 'tasks üzerinde. yeniden deneyin. 1m '(TTL = 60s) -' tasks'a dönüş; Daha fazla '5m/15m'.
18) Sonuç
EDA, entegrasyonları açık sözleşmeler ve yönetilen tutarlılık ile bir iş gerçekleri akışına dönüştürür. Temel oluşturun: şemalar + kayıt defteri, giden/gelen kutusu, sipariş anahtarları, idempotent işleyicileri, SLO ve gözlemlenebilirlik, güvenli tutma ve tekrar oynatma. Daha sonra olaylar, kırılgan bağlantılar ve gece geçişleri olmadan ölçeklendirme, analitik ve yeni özellikler için "gerçek kaynağınız" olacaktır.