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.
sumber
Jawaban:
Tinjau apa yang ditulis Rinat Abdullin tentang proses bisnis yang berkembang . Secara khusus, perhatikan rekomendasinya untuk mengembangkan proses bisnis di lingkungan yang berubah cepat - seorang manajer proses adalah "hanya" pengganti otomatis bagi manusia yang menatap layar.
Model mental saya sendiri dari seorang manajer proses adalah bahwa ini merupakan proyeksi yang bersumber dari peristiwa yang dapat Anda query untuk daftar perintah yang tertunda.
Ini model baca. Anda dapat membangun kembali manajer proses dari sejarah acara setiap kali Anda membutuhkannya; atau Anda dapat memperlakukannya seperti snapshot yang Anda perbarui.
Tidak - manajer proses adalah manajer . Itu tidak melakukan sesuatu yang berguna dengan sendirinya; alih-alih itu memberitahu agregat untuk melakukan pekerjaan (yaitu, membuat perubahan pada buku catatan).
Tentu. Catatan: di sebagian besar domain belanja "nyata", Anda tidak akan memaksa memesan inventaris sebelum memproses pesanan; itu menambah pertengkaran yang tidak perlu terhadap bisnis. Kemungkinan besar bisnis Anda ingin menerima pesanan, lalu meminta maaf dalam kasus langka bahwa pesanan tidak dapat dipenuhi pada waktu yang diperlukan.
Pesan memiliki data meta - khususnya, Anda dapat menyertakan causationIdentifier (sehingga Anda dapat mengidentifikasi perintah mana yang menghasilkan peristiwa mana) dan korelasi , untuk melacak percakapan secara umum.
Sebagai contoh, manajer proses menulis id sendiri sebagai korelasiId dalam perintah; peristiwa yang dihasilkan oleh salinan id korelasi dari perintah, dan manajer proses Anda berlangganan semua peristiwa yang memiliki korelasi sendiri.
Rekomendasi saya adalah tidak. Tetapi Udi Dahan memiliki pendapat berbeda yang harus Anda tinjau; yaitu bahwa CQRS hanya masuk akal jika agregat Anda adalah kisah-kisah - Udi menggunakan kisah di tempat manajer proses telah menjadi ejaan dominan.
Tidak juga? Manajer proses terutama berkaitan dengan orkestrasi, bukan keadaan domain. Sebuah instance dari suatu proses akan memiliki "keadaan", dalam bentuk sejarah dari semua peristiwa yang telah mereka amati - hal yang benar untuk dilakukan dalam menanggapi peristiwa Z tergantung pada apakah kita telah melihat peristiwa X dan Y atau tidak. Jadi, Anda mungkin harus dapat menyimpan dan memuat representasi negara itu (yang bisa menjadi sesuatu yang datar, atau bisa menjadi sejarah peristiwa yang diamati).
(Saya mengatakan "tidak benar-benar" karena agregat didefinisikan secara samar-samar sehingga tidak sepenuhnya salah untuk mengklaim bahwa daftar peristiwa yang diamati adalah "agregat". Perbedaannya lebih semantik daripada implementasi - kami memuat status proses dan kemudian memutuskan pesan yang akan dikirim ke kirim ke bagian-bagian sistem yang bertanggung jawab atas status domain . Ada sedikit lambaian tangan di sini.)
Tidak cukup - manajemen negara bukan pelaku, ini pelacak penjaga. Dalam keadaan di mana palungan proses seharusnya tidak memancarkan sinyal apa pun, Anda memberinya koneksi inert ke dunia. Dengan kata lain,
dispatch(command)
adalah no-op.sumber
Apa yang Anda cari memiliki pola yang disebut "Saga", yang pada dasarnya adalah manajer proses.
Saga juga sempurna untuk proses yang berjalan lama, karena dapat mempertahankan status di antara perintah yang berkorelasi.
Ini adalah artikel bagus tentang Sagas
sumber