Baru-baru ini saya mulai terjun ke CQRS / ES karena saya mungkin perlu menerapkannya di tempat kerja. Tampaknya sangat menjanjikan dalam kasus kami, karena akan menyelesaikan banyak masalah.
Saya membuat sketsa pemahaman kasar saya tentang bagaimana aplikasi ES / CQRS akan terlihat seperti dikontekstualisasikan ke kasus penggunaan perbankan yang disederhanakan (menarik uang).
Singkatnya, jika orang A menarik uang:
- perintah dikeluarkan
- perintah diserahkan untuk validasi / verifikasi
- suatu acara didorong ke toko peristiwa jika validasi berhasil
- agregator mengumumkan acara untuk menerapkan modifikasi pada agregat
Dari apa yang saya mengerti, log peristiwa adalah sumber kebenaran, karena ini adalah log FACTS, kemudian kita dapat memperoleh proyeksi apa pun darinya.
Sekarang, apa yang saya tidak mengerti, dalam skema besar ini, adalah apa yang terjadi dalam kasus ini:
- aturan: keseimbangan tidak boleh negatif
- orang A memiliki saldo 100e
- person A mengeluarkan Perintah Penarikan dari 100e
- melewati validasi dan acara MoneyWithdrewEvent of 100e dipancarkan
- Sementara itu, orang A mengeluarkan Perintah Penarikan lain dari 100e
- MoneyWithdrewEvent pertama belum diagregasi, oleh karena itu validasi lolos, karena pemeriksaan validasi terhadap agregat (yang belum diperbarui)
- MoneyWithdrewEvent of 100e dipancarkan di lain waktu
==> Kami berada dalam kondisi keseimbangan yang tidak konsisten pada -100e dan log berisi 2 MoneyWithdrewEvent
Seperti yang saya pahami ada beberapa strategi untuk mengatasi masalah ini:
- a) menempatkan id versi agregat bersama dengan acara di toko acara sehingga jika ada ketidakcocokan versi saat modifikasi, tidak ada yang terjadi
- b) menggunakan beberapa strategi penguncian, menyiratkan bahwa lapisan verifikasi harus entah bagaimana membuatnya
Pertanyaan yang terkait dengan strategi:
- a) Dalam hal ini, log peristiwa bukan lagi sumber kebenaran, bagaimana menghadapinya? Juga, kami kembali ke klien, OK, padahal benar-benar salah untuk mengizinkan penarikan, apakah lebih baik dalam hal ini menggunakan kunci?
- b) Kunci == kebuntuan, apakah Anda memiliki wawasan tentang praktik terbaik?
Secara keseluruhan, apakah pemahaman saya benar tentang cara menangani konkurensi?
Catatan: Saya mengerti bahwa orang yang sama menarik dua kali uang dalam waktu sesingkat itu tidak mungkin, tetapi saya mengambil contoh sederhana, tidak tersesat dalam detail