GH GambleHub

Olay Kaynak Kullanımı: temel bilgiler

Olay Kaynağı Nedir

Event Sourcing (ES), etki alanı nesnelerinin durumunu "geçerli çizgi'olarak değil, olan her şeyi açıklayan değiştirilemez bir olay günlüğü olarak depolamanın bir yoludur. Toplamın mevcut durumu, olaylarını yuvarlayarak (tekrar oynatarak) elde edilir ve okunan görünümler bu kütüğün üzerine projeksiyonlar olarak inşa edilir.

Temel çıkarımlar:
  • Tarih "hakikatin birincil kaynağı'dır, devlet tarihin izdüşümüdür.
  • Herhangi bir durum çoğaltılabilir, kontrol edilebilir ve açıklanabilir (denetim).
  • Yeni görünümler ve analizler eklemek, eski "anlık görüntülerin" geçişini gerektirmez - olayları kaybetmek yeterlidir.

Temel terimler

Agrega - açık değişmezlerle tutarlılık alan birimi (Sipariş, Ödeme, Kullanıcı Dengesi).
Olay - geçmişte meydana gelen değişmeyen bir gerçek ('ödeme. Yetkili ',' emri. gönderildi ').
Olay Deposu, birim içindeki olayların sırasını sağlayan yalnızca ek bir günlüktür.
Toplam sürüm, son uygulanan olayın sayısıdır (iyimser eşzamanlılık için).
Snapshot - evrişim hızlandırmak için durumun periyodik bir izlenim.
Projeksiyon (okuma modeli) - okuma/arama/raporlama için materyalize görünüm (genellikle asenkron).

Nasıl çalışır (iş parçacığı - olaylar - projeksiyonlar)

1. İstemci bir komut gönderir ('CapturePayment', 'PlaceOrder').
2. Toplam, değişmezleri doğrular ve hepsi tamam ise, olaylar üretir.
3. Olaylar, sürüm doğrulaması (iyimser eşzamanlılık) ile Olay Mağazasına atomik olarak eklenir.
4. Projeksiyon işlemcileri olay akışına abone olur ve okunan modelleri günceller.
5. Aşağıdaki komut için toplama yüklendiğinde, durum anlık görüntüye (varsa) - anlık görüntüden sonraki olaya geri yüklenir.

Olay tasarımı

Gerekli Nitelikler (Çekirdek)

json
{
"event_id": "uuid",
"event_type": "payment. authorized. v1",
"aggregate_type": "Payment",
"aggregate_id": "pay_123",
"aggregate_version": 5,
"occurred_at": "2025-10-31T10:42:03Z",
"payload": { "amount": 1000, "currency": "EUR", "method": "card" },
"meta": { "trace_id": "t-abc", "actor": "user_42" }
}
Öneriler:
  • Adlandırma: 'domain. eylem. v {major} '.
  • Ekleme: yeni alanlar, eskilerin anlamını değiştirmeden isteğe bağlıdır.
  • Minimalizm: Kolayca kurtarılabilir verilerin çoğaltılması olmadan sadece gerçekler.

Sözleşmeler ve planlar

Şemaları düzeltin (Avro/JSON Schema/Protobuf) ve CI'da uyumluluğu kontrol edin.
"Kırılma" değişiklikleri için - olayın yeni bir ana sürümü ve göç dönemi için paralel yayın 'v1'/' v2'.

Rekabetçi erişim: iyimser eşzamanlılık

Kural: Yeni olaylar ancak 'expected _ version = = current_version' olduğunda yazılabilir.

Sözde kod:
pseudo load: snapshot(state, version), then apply events > version new_events = aggregate. handle(command)
append_to_store(aggregate_id, expected_version=current_version, events=new_events)
//if someone has already written an event between load and append, the operation is rejected -> retray with reload

Böylece, dağıtılmış işlemler olmadan değişmezlerin bütünlüğünü garanti ediyoruz.

Anlık görüntüler (evrişim ivmesi)

Her N olay veya zamanlayıcıda bir anlık görüntü alın.
'snapshot _ state', 'aggregate _ id', 'version', 'created _ at' Храните.
Her zaman anlık görüntüden sonra olayları kontrol edin ve yakalayın (sadece oyuncu kadrosuna güvenmeyin).
Anlık görüntüleri günlükten yeniden oluşturulabilmeleri için kaldırın ("sihirli" alanları saklamayın).

Projeksiyonlar ve CQRS

ES doğal olarak CQRS ile birleştirilir:
  • Write-model = aggregates + Event Store.
  • Modelleri okuyun = olaylar tarafından güncellenen projeksiyonlar (Redis kartları, arama için OpenSearch, raporlama için ClickHouse/OLAP).
  • Projeksiyonlar idempotent: Aynı 'event _ id'nin yeniden işlenmesi sonucu değiştirmez.

Devre evrimi ve uyumluluğu

Additive-first: alan ekle; Türleri/anlambilimleri değiştirmeyin.
Karmaşık değişiklikler için yeni olay türlerini serbest bırakın ve projeksiyon geçicilerini yazın.
Geçiş dönemi için çift giriş ('v1' + 'v2') yapın ve tüm projeksiyonlar hazır olduğunda 'v1'i çekin.

Güvenlik, PII ve "unutulma hakkı"

Tarih genellikle hassas veriler içerir. Yaklaşımlar:
  • Olaylardaki PII'yi en aza indirin (veriler yerine tanımlayıcılar, korunan taraflardaki ayrıntılar).
  • Kripto silme: alanları şifreleyin ve silme istendiğinde anahtarı yok edin (olay kalır, ancak veri kullanılamaz).
  • Gözden geçirme olayları: 'Kullanıcı. Piiredacted. v1 'projeksiyonlarda hassas alanların değiştirilmesi ile (tarih düzenleme gerçeğini korur).
  • Saklama ilkeleri: Bazı etki alanları için bazı olaylar WORM deposuna arşivlenebilir.

Performans ve ölçek

Bölümleme: kümenin içindeki sıra önemlidir - 'agregate _ id'ile bölümleme.
Soğuk başlangıç: anlık görüntüler + periyodik "sıkıştırıcı" evrişim.
Toplu ek - bir işlemde grup olayları.
Projeksiyon işlemcileri için geri basınç ve DLQ; Gecikmeyi ölçün (zaman ve mesaj sayısı).
Etkinlik Mağazası dizinleme: '(aggregate_type, aggregate_id)'ve zamana göre hızlı erişim.

Test etme

Kümeler için spesifikasyon testleri - "komutlar - beklenen olaylar" senaryosu.
Projeksiyon testleri: Olay akışını besleyin ve maddeleşmiş durumu/indeksleri kontrol edin.
Tekrarlanabilirlik testleri: projeksiyonları standda sıfırdan yeniden oluşturun - sonucun eşleştiğinden emin olun.
Kaos/gecikme: gecikmeler ve alır enjekte, idempotence kontrol.

Etki alanı örnekleri

1) Ödemeler

Olaylar: 'ödeme. ',' ödeme başlatıldı. Yetkili ',' ödeme. Yakalanan ', ödeme. İade edildi '.
Değişmezler: 'yetkili' olmadan 'yakalama' yapamazsınız; miktarlar negatif değildir; Para birimi değişmedi.
Projeksiyonlar: "Ödeme kartı" (KV), işlem arama (OpenSearch), raporlama (OLAP).

2) Siparişler (e-ticaret)

Olaylar: 'Düzen. ',' emri verildi. Ücretli ',' emri. paketlenmiş ',' sipariş. ',' siparişi gönderildi. Teslim edildi.
Değişmezler: durum tablosu durum geçişleri; İptal'sevk 'edilmeden önce mümkündür.
Projeksiyonlar: Kullanıcı siparişlerinin listesi, duruma göre SLA panoları.

3) Bilançolar (Finans/iGaming)

Olaylar: 'denge. deposited ',' bakiye. debited ',' bakiyesi. Kredilendirilmiş ',' denge. ayarlandı '.
Sabit değişmez: denge gitmez <0; Komutlar 'operation _ id'dir.
Kritik işlemler doğrudan agrega (katı tutarlılık), UI - projeksiyondan (nihai) okunur.

Tipik Olay Mağazası yapısı (DB varyantı)

olaylar

'event _ id (PK)', 'aggregate _ type', 'aggregate _ id', 'version', 'occured _ at', 'event _ type', 'payload', 'meta'

Dizin: '(aggregate_type, aggregate_id, sürüm)'.

anlık görüntüler

'aggregate _ type', 'aggregate _ id', 'version', 'state', 'created _ at'

Dizin: '(aggregate_type, aggregate_id)'.

consumers_offsets

'consumer _ id', 'event _ id'/' position', 'updated _ at' (projeksiyonlar ve perakende satış için).

Sıkça Sorulan Sorular (SSS)

Her yerde ES kullanmak zorunlu mu?
Hayır. ES, denetim, karmaşık değişmezler, tekrarlanabilirlik ve verilerin farklı temsilleri önemli olduğunda yararlıdır. Basit CRUD için bu gereksizdir.

Peki ya "mevcut durum" talepleri?
Ya projeksiyondan (hızlı, nihai) veya üniteden (daha pahalı, ancak kesinlikle) okuyun. Kritik işlemler genellikle ikinci yolu kullanır.

Kafka/stream broker'a ihtiyacım var mı?
Etkinlik Mağazası - gerçeğin kaynağı; Broker, olayları projektörlere ve harici sistemlere dağıtmak için uygundur.

"Unutulma hakkı'ile ne yapmalı?
PII'yi en aza indirin, hassas alanları şifreleyin ve projeksiyonlarda kripto silme/redaksiyon uygulayın.

Eski verileri nasıl taşırım?
Geriye dönük olay oluşturma ("re-highstory") için bir senaryo yazın veya "olduğu gibi durum'ile başlayın ve olayları yalnızca yeni değişiklikler için yayınlayın.

Antipatterns

Event Sourcing "alışkanlık dışı": alan yararı olmadan sistemi karmaşıklaştırır.
Yağ olayları: PII ve çiftler ile şişirilmiş yükler - frenler ve uyumluluk sorunları.
İyimser eşzamanlılık eksikliği: Yarış sırasında değişmezlerin kaybı.
Yeniden üretilemeyen projeksiyonlar: tekrar oynatma/anlık görüntü yok - manuel düzeltmeler.
Etki alanı olayları olarak ham CDC'ler: sızdırılmış DB şemaları ve sert bağlantı.
İç ve entegrasyon olaylarını karıştırma: Dışarıda stabilize bir "vitrin" yayınlayın.

Üretim kontrol listesi

  • Kümeler, değişmezler ve olaylar (başlıklar, sürümler, şemalar) tanımlanır.
  • Etkinlik Mağazası, toplam ve iyimser eşzamanlılık içinde düzen sağlar.
  • Anlık görüntüler ve yeniden inşa planları dahildir.
  • Projeksiyonlar idempotent, DLQ'lar ve gecikme metrikleri var.
  • Şemalar CI'da doğrulanır, sürüm politikası belgelenir.
  • PII minimize edilir, alanlar şifrelenir, "unutma" stratejisi vardır.
  • Projeksiyon tekrarı bankta kontrol edildi; felaket kurtarma planı var.
  • Gösterge tabloları: uygulama hızı, projeksiyon gecikmesi, uygulama hataları, geri çekilmelerin oranı.

Toplam

Olay Kaynağı, sistemin tarihini birinci sınıf bir eser haline getirir: gerçekleri yakalar, devleti onlardan yeniden üretir ve özgürce herhangi bir temsil oluştururuz. Bu, denetim, değişime karşı direnç ve analitiğin esnekliğini sağlar - programlarda disipline, rekabetçi kontrole ve hassas verilerle yetkin çalışmaya tabidir.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.