Saya terus kembali ke QA ini. Dan saya tidak menemukan jawaban yang ada cukup bernuansa, jadi saya menambahkan jawaban ini.
TL; DR. Ya atau Tidak, tergantung pada penggunaan sumber acara Anda.
Ada dua jenis utama sistem sumber acara yang saya sadari.
Prosesor acara hilir = Ya
Dalam sistem semacam ini, peristiwa terjadi di dunia nyata dan dicatat sebagai fakta. Seperti sistem gudang untuk melacak palet produk. Pada dasarnya tidak ada peristiwa yang saling bertentangan. Semuanya sudah terjadi, walaupun itu salah. (Yaitu palet 123456 memakai truk A, tetapi dijadwalkan untuk truk B.) Kemudian fakta diperiksa untuk pengecualian melalui mekanisme pelaporan. Kafka tampaknya sangat cocok untuk aplikasi pemrosesan acara seperti ini.
Dalam konteks ini, dapat dimengerti mengapa orang Kafka mengadvokasi itu sebagai solusi Event Sourcing. Karena sangat mirip dengan cara penggunaannya, misalnya, klik aliran. Namun, orang yang menggunakan istilah Pengadaan Acara (yang bertentangan dengan Pemrosesan Streaming) cenderung merujuk pada penggunaan kedua ...
Sumber kebenaran yang dikendalikan aplikasi = Tidak
Aplikasi semacam ini menyatakan acara sendiri sebagai hasil dari permintaan pengguna yang melewati logika bisnis. Kafka tidak berfungsi dengan baik dalam hal ini karena dua alasan utama.
Kurangnya isolasi entitas
Skenario ini membutuhkan kemampuan untuk memuat aliran acara untuk entitas tertentu. Alasan umum untuk ini adalah untuk membangun model tulis sementara untuk logika bisnis untuk digunakan untuk memproses permintaan. Melakukan ini tidak praktis di Kafka. Menggunakan topik per entitas dapat memungkinkan hal ini, kecuali ini bukan permulaan ketika mungkin ada ribuan atau jutaan entitas. Ini karena batasan teknis di Kafka / Zookeeper.
Salah satu alasan utama untuk menggunakan model tulis sementara dengan cara ini adalah untuk membuat perubahan logika bisnis murah dan mudah digunakan.
Disarankan menggunakan topik per jenis untuk Kafka, tetapi ini membutuhkan pemuatan acara untuk setiap entitas dari tipe itu hanya untuk mendapatkan acara untuk satu entitas. Karena Anda tidak dapat mengetahui posisi log peristiwa mana yang dimiliki entitas mana. Bahkan menggunakan Snapshots untuk memulai dari posisi log yang diketahui, ini bisa menjadi sejumlah besar peristiwa yang harus dilalui.
Kurangnya deteksi konflik
Kedua, pengguna dapat membuat kondisi balapan karena permintaan bersamaan terhadap entitas yang sama. Mungkin sangat tidak diinginkan untuk menyimpan peristiwa yang saling bertentangan dan menyelesaikannya setelah fakta. Jadi penting untuk bisa mencegah peristiwa yang saling bertentangan. Untuk skala pemuatan permintaan, adalah umum untuk menggunakan layanan stateless sambil mencegah konflik penulisan menggunakan penulisan bersyarat (hanya menulis jika peristiwa entitas terakhir adalah #x). Aka Optimis Concurrency. Kafka tidak mendukung konkurensi optimis. Bahkan jika itu mendukungnya di tingkat topik, itu akan perlu sampai ke tingkat entitas untuk menjadi efektif. Untuk menggunakan Kafka dan mencegah peristiwa yang saling bertentangan, Anda harus menggunakan penulis berseri, berseri di tingkat aplikasi. Ini adalah persyaratan / batasan arsitektur yang signifikan.
Informasi lebih lanjut
Perbarui per komentar
Komentar telah dihapus, tetapi pertanyaannya adalah seperti: apa yang digunakan orang untuk penyimpanan acara?
Tampaknya sebagian besar orang menggelar implementasi penyimpanan acara mereka sendiri di atas basis data yang ada. Untuk skenario yang tidak terdistribusi, seperti back-end internal atau produk yang berdiri sendiri, terdokumentasi dengan baik bagaimana membuat event store berbasis SQL. Dan ada perpustakaan yang tersedia di atas berbagai macam basis data. Ada juga EventStore , yang dibangun untuk tujuan ini.
Dalam skenario terdistribusi, saya telah melihat beberapa implementasi yang berbeda. Proyek Jet's Panther menggunakan Azure CosmosDB , dengan fitur Change Feed untuk memberi tahu pendengar. Implementasi serupa lainnya yang pernah saya dengar di AWS adalah menggunakan DynamoDB dengan fitur Streams untuk memberi tahu pendengar. Kunci partisi mungkin harus menjadi id aliran untuk distribusi data terbaik (untuk mengurangi jumlah penyediaan berlebihan). Namun, replay penuh lintas sungai di Dynamo mahal (baca dan hemat biaya). Jadi impl ini juga disiapkan untuk Dynamo Streams untuk membuang acara ke S3. Ketika pendengar baru daring, atau pendengar yang ada ingin ulangan penuh, ia akan membaca S3 untuk mengejar ketinggalan terlebih dahulu.
Proyek saya saat ini adalah skenario multi-tenant, dan saya menggulirkan sendiri di atas Postgres. Sesuatu seperti Citus tampaknya sesuai untuk skalabilitas, dipartisi oleh aliran + tentant.
Kafka masih sangat berguna dalam skenario terdistribusi. Merupakan masalah non-sepele untuk mengekspos acara masing-masing layanan ke layanan lain. Sebuah toko acara tidak dibangun untuk itu biasanya, tapi justru itulah yang dilakukan Kafka dengan baik. Setiap layanan memiliki sumber kebenaran internal sendiri (dapat berupa penyimpanan acara atau lainnya), tetapi mendengarkan Kafka untuk mengetahui apa yang terjadi "di luar". Layanan ini juga dapat memposting acara ke Kafka untuk menginformasikan "luar" hal-hal menarik yang dilakukan layanan.