Saya sedang mengerjakan contoh aplikasi kecil untuk mempelajari konsep CQRS dan event sourcing. Saya memiliki Basket
agregat dan Product
agregat yang harus bekerja secara independen.
Berikut beberapa kode semu untuk menunjukkan implementasinya
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; }
Perintah sangat mirip dengan acara, menggunakan nama imperatif dan bukan lampau.
Sekarang ini bekerja dengan baik secara mandiri. Saya mengeluarkan perintah AddItem
, dan itu menciptakan ItemAdded
acara pada Basket
agregat yang melakukan apa yang perlu dilakukan dengan keadaan 'Keranjang'. Demikian pula, untuk produk, perintah dan acara berfungsi dengan baik.
Sekarang saya ingin menggabungkan ini ke dalam proses yang akan berjalan seperti ini (dalam hal perintah dan peristiwa yang terjadi):
Manajer proses akan melakukan hal berikut:
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...
Pertanyaan yang saya tidak dapat menemukan jawaban pasti adalah:
- Apakah saya perlu bertahan pada manajer proses? Sepertinya saya lakukan, tetapi saya tidak yakin
- Jika saya melakukannya, saya harus menyimpan acara untuk manajer proses. Namun, peristiwa yang didengarnya terkait dengan kelompok unsur kehidupan. Apakah saya menambahkan id proses itu? Apakah saya memiliki acara terpisah hanya untuk manajer proses? Cara melakukan ini dan tetap KERING mungkin
- Bagaimana saya tahu untuk apa keranjang
ProductReserved
acara? Apakah boleh menggunakanBasketId
itu juga, atau apakah itu info yang bocor? - Bagaimana saya menjaga hubungan antara acara, bagaimana saya tahu yang
ItemAdded
menghasilkanProductReserved
acara yang mana ? Apakah saya melewati sebuahEventId
? Ini sepertinya aneh ... - Haruskah saya menerapkan
Basket
sebagai manajer proses daripada agregat sederhana?
Setelah beberapa penelitian lebih lanjut saya datang ke ini: Saga adalah sesuatu yang membuat acara sendiri dan mendengarkan acara dari luar. Pada dasarnya, ini adalah Agregat yang juga dapat bereaksi terhadap peristiwa yang terjadi di luar dunia kecil itu sendiri.
Seorang Manajer Proses bekerja dengan peristiwa dari luar dan mengirimkan perintah. Riwayatnya dapat dibangun kembali dari peristiwa yang terjadi pada Agregat yang berbagi pengidentifikasi umum seperti korelasiId.