Proyek GitHub CQRS.NET memiliki beberapa contoh konkret tentang bagaimana Anda dapat melakukan EventStores dalam beberapa teknologi berbeda. Pada saat penulisan, ada implementasi dalam SQL menggunakan Linq2SQL dan skema SQL yang menyertainya, ada satu untuk MongoDB , satu untuk DocumentDB (CosmosDB jika Anda berada di Azure) dan satu lagi menggunakan EventStore (seperti yang disebutkan di atas). Ada lebih banyak di Azure seperti Penyimpanan Tabel dan penyimpanan Blob yang sangat mirip dengan penyimpanan file datar.
Saya kira poin utama di sini adalah bahwa mereka semua sesuai dengan prinsip / kontrak yang sama. Mereka semua menyimpan informasi di satu tempat / wadah / tabel, mereka menggunakan metadata untuk mengidentifikasi satu peristiwa dari yang lain dan 'hanya' menyimpan seluruh peristiwa sebagaimana adanya - dalam beberapa kasus berseri, dalam teknologi pendukung, sebagaimana adanya. Jadi, bergantung pada apakah Anda memilih database dokumen, database relasional, atau bahkan file datar, ada beberapa cara berbeda untuk semuanya mencapai maksud yang sama dari penyimpanan acara (ini berguna jika Anda berubah pikiran kapan saja dan merasa perlu bermigrasi atau mendukung lebih dari satu teknologi penyimpanan).
Sebagai pengembang di proyek ini, saya dapat membagikan beberapa wawasan tentang beberapa pilihan yang kami buat.
Pertama-tama kami menemukan (bahkan dengan UUID / GUID yang unik alih-alih bilangan bulat) karena berbagai alasan ID berurutan terjadi karena alasan strategis, jadi hanya memiliki ID tidak cukup unik untuk sebuah kunci, jadi kami menggabungkan kolom kunci ID utama kami dengan data / tipe objek untuk membuat kunci yang benar-benar unik (dalam arti aplikasi Anda). Saya tahu beberapa orang mengatakan Anda tidak perlu menyimpannya, tetapi itu akan tergantung pada apakah Anda greenfield atau harus hidup berdampingan dengan sistem yang ada.
Kami terjebak dengan satu wadah / tabel / koleksi untuk alasan pemeliharaan, tetapi kami bermain-main dengan tabel terpisah per entitas / objek. Dalam praktiknya, kami menemukan bahwa aplikasi tersebut memerlukan izin "BUAT" (yang secara umum bukanlah ide yang baik ... umumnya, selalu ada pengecualian / pengecualian) atau setiap kali entitas / objek baru muncul atau diterapkan, baru wadah penyimpanan / meja / koleksi perlu dibuat. Kami mendapati bahwa ini sangat lambat untuk pengembangan lokal dan bermasalah untuk penerapan produksi. Anda mungkin tidak, tapi itulah pengalaman dunia nyata kami.
Hal lain yang perlu diingat adalah bahwa meminta tindakan X terjadi dapat mengakibatkan banyak peristiwa berbeda terjadi, sehingga mengetahui semua peristiwa yang dihasilkan oleh perintah / peristiwa / apa pun itu berguna. Mereka mungkin juga berada di berbagai jenis objek yang berbeda misalnya mendorong "beli" di keranjang belanja dapat memicu peristiwa akun dan pergudangan untuk diaktifkan. Aplikasi yang memakan mungkin ingin mengetahui semua ini, jadi kami menambahkan CorrelationId. Ini berarti konsumen dapat meminta semua peristiwa yang diangkat sebagai hasil dari permintaan mereka. Anda akan melihatnya di skema .
Khususnya dengan SQL, kami menemukan bahwa kinerja benar-benar menjadi penghambat jika indeks dan partisi tidak digunakan secara memadai. Ingat acara perlu dialirkan dalam urutan terbalik jika Anda menggunakan snapshot. Kami mencoba beberapa indeks berbeda dan menemukan bahwa dalam praktiknya, beberapa indeks tambahan diperlukan untuk men-debug aplikasi dunia nyata dalam produksi. Sekali lagi Anda akan melihat itu di skema .
Metadata dalam produksi lainnya berguna selama investigasi berbasis produksi, stempel waktu memberi kami wawasan tentang urutan peristiwa yang dipertahankan vs dimunculkan. Itu memberi kami beberapa bantuan pada sistem yang sangat didorong oleh peristiwa yang mengangkat sejumlah besar peristiwa, memberi kami informasi tentang kinerja hal-hal seperti jaringan dan distribusi sistem di seluruh jaringan.