Jadi, apa yang saya lewatkan?
Menerima tebakan.
Hal pertama yang mungkin Anda lewatkan adalah Anda hanya perlu memuat ulang acara untuk keadaan yang Anda bangun kembali. Jika Anda dapat memodelkan batas-batas transaksi Anda dengan bersih, setiap objek dapat menuliskan peristiwa yang ditandai dengan idnya sendiri, dan kemudian membaca kembali hanya dalam peristiwa itu. Menggunakan database relasional untuk penyimpanan acara, akan ada kolom id yang diindeks untuk mempercepat permintaan itu. Menggunakan EventStore, setiap objek akan memiliki alirannya sendiri.
Anda perlu berhati-hati dalam model Anda untuk melakukan ini dengan bersih, karena Anda ingin memastikan bahwa Anda hanya memodifikasi satu objek dalam setiap transaksi, dan oleh karena itu Anda perlu berhati-hati bahwa Anda mengisolasi setiap invarian dengan benar yang Anda coba lakukan. melaksanakan.
Dalam kasus di mana itu tidak cukup cepat, Anda masih memiliki kemungkinan untuk membuat snapshot dari negara Anda (memoisasi), dan bertahan dalam "penyimpanan tradisional". Setiap snapshot akan ditandai dengan nomor urut kejadian terakhir yang digunakan untuk membuat snapshot; saat memuat ulang, repositori mengambil snapshot itu terlebih dahulu, lalu menerapkan peristiwa yang lebih baru. (Ini menyiratkan beberapa cara yang masuk akal untuk mengambil foto-foto yang lebih baru - baik peristiwa juga ditandai dengan nomor urut, atau Anda memiliki beberapa cara yang efisien untuk membaca aliran acara mundur sampai Anda mencapai titik awal Anda.)
Masih ada keuntungan dibandingkan pendekatan yang biasa di sini, adalah bahwa snapshot Anda dapat dibangun secara paralel dengan tulisan Anda, daripada digabungkan dengan mereka: Anda hanya menempatkan pendengar acara di beberapa utas / proses lain, dan membiarkannya dengan riang saat menulis ke toko foto pada jadwal apa pun yang tampaknya masuk akal. Lagipula, snapshot tidak perlu tepat waktu - cukup sering sehingga pekerjaan menerapkan kembali peristiwa yang lebih baru tidak menghancurkan SLA Anda.
(Snapshotting memang menyulitkan migrasi; setiap perubahan serialisasi model akan membuat cache snapshot tidak valid. Tentu saja, Anda dapat membangun kembali snapshots menggunakan serialisasi baru sebagai bagian dari migrasi, dan kemudian "mengejar" ketika perubahan ditayangkan.)
Apakah mengembalikan keadaan dari aliran peristiwa bahkan biasa dilakukan?
Ya itu. Apa yang biasanya ditunjukkan dalam contoh CQRS adalah bahwa lapisan Aplikasi, setelah memastikan bahwa perintah yang dikirimkan terbentuk dengan baik, lapisan aplikasi akan memuat objek domain dari repositori, di mana beban adalah konstruktor default diikuti oleh replay dari aliran peristiwa (atau setara, panggilan ke pabrik dengan daftar acara).
Dua pikiran kontradiktif lainnya.
- Mungkin ada cache di belakang antarmuka repositori
- Cache invalidation adalah salah satu dari dua masalah sulit.