Pendahuluan
Dalam meetup Server Karrot, presentasi tentang event sourcing oleh Won Jihyeok sangat membantu saya memahami event sourcing. Saya merangkum konsep dasar event sourcing dan, berdasarkan isi presentasi tersebut, mencoba membuat layanan config sederhana berbasis NestJS, TypeScript, dan MongoDB.
- Sumber asli: Membangun platform internal yang dapat diskalakan dengan memanfaatkan event sourcing | Karrot SERVER Meetup #2
- Contoh source code layanan config event sourcing
Konsep Dasar Event Sourcing
- Berbeda dari pendekatan CRUD tradisional, semua perubahan state dicatat sebagai event yang immutable sehingga audit trail dan rollback menjadi lebih mudah
- Seperti buku besar akuntansi yang mencatat semua transaksi (event) secara berurutan, state saat ini dapat direkonstruksi kapan saja
Komponen Inti
- Event
- Mencakup ID unik, waktu pembuatan, tipe event, informasi pengguna, dan isi (body), serta menjamin sifat immutable dan self-contained
- State
- State akhir yang dihasilkan dengan memutar ulang seluruh event (bila perlu dapat memanfaatkan snapshot atau cache)
- Reducer
- Fungsi murni yang menerima state sebelumnya dan event sebagai input untuk menghitung state baru sambil mempertahankan immutability
- Entity
- Mengelompokkan event-event terkait dan mengelolanya sebagai satu objek, sehingga riwayat perubahan entity tertentu dapat ditelusuri secara efisien
Contoh Implementasi dan Struktur
- Pengaturan lingkungan dasar: Menjalankan aplikasi menggunakan NestJS
- Definisi entity dan event
- Mendefinisikan dengan jelas berbagai event (misalnya pembuatan konfigurasi, penambahan/penghapusan parameter) dan objek state menggunakan interface TypeScript dan skema MongoDB
- Implementasi reducer:
- Menulis fungsi murni yang memperbarui state berdasarkan tipe event, lalu menghasilkan state akhir dengan memutar ulang urutan event
- Endpoint API dan service layer
- Mengimplementasikan REST API yang menyediakan pembuatan config, pengambilan data, serta penambahan/penghapusan parameter
- Menggunakan pola dispatch-commit untuk memproses penerbitan event, perhitungan state, dan penyimpanan event secara berurutan
Pengembangan Lanjutan dan Integrasi dengan Sistem Eksternal
- Generic interface
- Merancang event repository yang dapat digunakan ulang untuk mengurangi duplikasi kode dan memastikan type safety
- Event handler
- Terhubung dengan sistem eksternal seperti Slack untuk melakukan pemrosesan tambahan, seperti mengirim notifikasi saat event terjadi
- Strategi optimasi performa
- Snapshot: Menyimpan state pada titik waktu tertentu lalu hanya menerapkan event setelahnya, sehingga mengurangi biaya pemutaran ulang seluruh event
- Caching: Memanfaatkan cache in-memory atau Redis untuk menyediakan state entity yang sering diakses dengan lebih cepat
Kesimpulan
- Event sourcing adalah arsitektur yang kuat untuk meningkatkan keandalan dan kemudahan pemeliharaan dengan mencatat seluruh riwayat perubahan secara jelas
- Penerapannya perlu dilakukan secara bertahap sesuai domain, disertai strategi optimasi seperti snapshot dan caching untuk menjaga performa sistem, serta mempertimbangkan learning curve sebelum mengadopsinya secara hati-hati
1 komentar
Bagus bagus! ^0^