Kısa süre önce CQRS / ES'ye dalmaya başladım çünkü iş yerinde uygulamam gerekebilir. Bir çok sorunu çözeceği için bizim durumumuzda çok umut verici görünüyor.
Bir ES / CQRS uygulamasının basitleştirilmiş bir bankacılık kullanım örneğine nasıl bağlamsallaştırılmış gibi görünmesi gerektiği konusundaki kaba anlayışımı tasvir ettim (para çekme).
Özetle, eğer A kişisi biraz para çekerse:
- bir komut verildi
- doğrulama / doğrulama için komut teslim edilir
- doğrulama başarılı olursa bir olay olay deposuna gönderilir
- toplayıcı, toplamaya değişiklik uygulamak için olayı ayıklar
Anladığım kadarıyla, olay günlüğü gerçeğin kaynağıdır, çünkü GERÇEKLER günlüğü olduğundan, bundan herhangi bir projeksiyon elde edebiliriz.
Şimdi, anlamadığım şey, bu büyük şey şemasında, bu durumda olan şeydir:
- kural: bir denge negatif olamaz
- A kişisinin 100e dengesi var
- A kişisi 100e'lik bir Para Çekme Komutu yayınlar
- doğrulama geçer ve 100e etkinliğinde MoneyWithdrewEvent yayınlanır
- bu arada A kişisi 100e'lik başka bir Para Çekme Komutu yayınlar
- ilk MoneyWithdrewEvent henüz toplanmadı ve bu nedenle doğrulama geçti, çünkü toplamaya karşı doğrulama denetimi (henüz güncellenmedi)
- 100e MoneyWithdrewEvent başka bir zaman daha yayıyor
==> Dengenin -100e'de tutarsız bir durumdayız ve günlük 2 MoneyWithdrewEvent içeriyor
Anladığım kadarıyla bu sorunla başa çıkmak için birkaç strateji var:
- a) toplu sürüm kimliğini olay deposundaki olayla birlikte koyun, böylece değişiklik sırasında bir sürüm uyuşmazlığı varsa hiçbir şey olmaz
- b) doğrulama katmanının bir şekilde bir tane oluşturması gerektiğini ima eden bazı kilitleme stratejileri kullanın
Stratejilerle ilgili sorular:
- a) Bu durumda, olay günlüğü artık gerçeğin kaynağı değildir, bununla nasıl başa çıkılır? Ayrıca, istemciye geri döndük Tamam çekilmesine izin vermek tamamen yanlıştı, bu durumda kilit kullanmak daha mı iyi?
- b) Kilitler == kilitlenmeler, en iyi uygulamalar hakkında bir fikriniz var mı?
Genel olarak, eşzamanlılığın nasıl ele alınacağına dair anlayışım doğru mu?
Not: Aynı kişinin bu kadar kısa bir sürede iki kez para çekmesinin imkansız olduğunu anlıyorum, ancak ayrıntılara kaybolmamak için basit bir örnek aldım.