Saya merancang sistem yang menggunakan Pengadaan Acara, CQRS, dan layanan mikro. Saya mengerti bahwa ini bukan pola yang tidak biasa. Fitur utama dari layanan ini adalah kemampuan untuk merehidrasi / memulihkan dari sistem catatan. Layanan Microsoft akan menghasilkan perintah dan permintaan pada MQ (Kafka). Layanan microser lainnya akan merespons (acara). Perintah dan pertanyaan akan tetap ada pada S3 untuk tujuan audit dan pemulihan.
Proses pemikiran saat ini adalah bahwa, untuk tujuan memulihkan sistem, kita dapat mengekstrak log peristiwa dari S3 dan hanya memasukkannya kembali ke Kafka.
Namun, ini gagal untuk mengakui perubahan produsen dan konsumen dari waktu ke waktu. Versi pada tingkat perintah / kueri tampaknya menuju penyelesaian masalah tetapi saya tidak bisa memahami konsumen versi sehingga saya bisa menegakkan bahwa ketika perintah, selama pemulihan, diterima dan diproses, itu sama persis kode [versi] yang melakukan pemrosesan karena ini adalah pertama kalinya perintah diterima.
Apakah ada pola yang bisa saya gunakan untuk menyelesaikan ini? Adakah yang mengetahui sistem lain yang mengiklankan fitur ini?
EDIT: Menambahkan contoh.
'Pembeli' mengirim 'pertanyaan' ke 'penjual' di situs lelang saya. Alurnya terlihat sebagai berikut:
UI -> Web App: POST /question {:text text :to seller-id :from user-id}
Web App -> MQ: SEND {:command send-question :args [text seller-id user-id]}
MQ -< Audit: <command + args appended to log in S3>
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
Sekarang, sebagai hasil dari persyaratan bisnis baru, saya menyesuaikan konsumen 'Layanan pertanyaan', untuk bertahan dalam hitungan semua pertanyaan yang belum dibaca. Skema DB diubah. Kami belum memiliki gagasan apakah pertanyaan dibacakan oleh penjual, sampai sekarang. Baris terakhir menjadi:
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
- Increment 'unread questions count'
Dua perintah adalah masalah, satu sebelum perubahan, satu setelah perubahan. 'Jumlah pertanyaan yang belum dibaca' sama dengan 1.
Sistem macet. Kami memulihkan dengan memutar ulang perintah melalui kode baru . Pada akhir pemulihan, 'jumlah pertanyaan yang belum dibaca' kami sama dengan 2. Meskipun, dalam contoh yang dibuat-buat ini, hasilnya bukan bencana, keadaan yang telah dipulihkan bukan seperti sebelumnya.