Ben CQRS ve olay kaynak kavramlarını öğrenmek için küçük bir örnek uygulama üzerinde çalışıyorum. Bir Basket
topluluğum veProduct
Bağımsız olarak çalışması toplama var.
Uygulamayı göstermek için bazı sahte kodlar
Basket { BasketId; OrderLines; Address; }
// basket events
BasketCreated { BasketId; }
ItemAdded { BasketId; ProductId; Quantity }
AddItemSucceeded { BasketId; ProductId; Quantity }
AddItemRevoked { BasketId; ProductId; Quantity }
ItemRemoved { BasketId; ProductId; Quantity }
CheckedOut { BasketId; Address }
Product { ProductId; Name; Price; }
// product events
ProductReserved { ProductId; Quantity }
ProductReservationFailed { ProductId; Quantity }
ProductReservationCancelled { ProductId; Quantity; }
Komutlar, zorunlu adı kullanarak ve geçmiş zamanı değil, olaylara oldukça benzer.
Şu anda bunlar bağımsız olarak iyi çalışıyor. Bir komut AddItem
yayınlıyorum ItemAdded
veBasket
toplamada 'Sepet' durumu ile ne yapması gerektiğini yapan . Benzer şekilde, ürün için komut ve olaylar iyi çalışır.
Şimdi bunu (böyle komutlar ve olaylar açısından) böyle bir şey olacak bir süreçte birleştirmek istiyorum:
İşlem yöneticisi aşağıdakileri yapar:
on BasketCreated: CreateShoppingProcess
on ItemAdded: ReserveProduct
on ProductReserved: SucceedAddingItem // does nothing, but needs to be there so that the basket knows it can check out
on ProductReservationFailed: RevokeAddItem
on RemoveItem: CancelProductReservation
on Checkout: CreateOrder // create an order and so on...
Kesin cevapları bulamadığım sorular:
- Süreç yöneticisine devam etmem gerekiyor mu? Benim yaptığım gibi görünüyor, ama emin değilim
- Eğer yaparsam, süreç yöneticisi için olayları kaydetmem gerekir. Ancak, Dinlediği olaylar toplanmalara bağlıdır. İşlem kimliğini bunlara ekleyebilir miyim? Yalnızca işlem yöneticisi için ayrı etkinliklerim var mı? Bunu yapmak ve mümkün olduğunca KURU tutmak
ProductReserved
Etkinliklerin hangi sepet için olduğunu nasıl bilebilirim ? Bunlara da sahip olmak uygun mudurBasketId
yoksa sızan bilgi midir?- Etkinlikler arasında nasıl ilişki kurabilirim, hangisinin
ItemAdded
hangiProductReserved
etkinliği ürettiğini nasıl bilebilirim ? Ben birEventId
mı ? Bu tuhaf görünüyor ... Basket
Basit bir toplu işlem yerine işlem yöneticisi olarak mı uygulamalıyım ?
Biraz daha araştırma yaptıktan sonra buna geldim: Saga, kendi olaylarını koruyan ve dışarıdan gelen olayları dinleyen bir şey. Temel olarak, kendi küçük dünyasının dışında gerçekleşen olaylara da tepki verebilen bir Agrega.
İşlem Yöneticisi dışarıdan gelen olaylarla çalışır ve komutlar gönderir. Tarihi, korrelationId gibi ortak bir tanımlayıcıyı paylaşan Agregalarda meydana gelen olaylardan yeniden oluşturulabilir.