Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Pola sumber acara
Niat
Dalam arsitektur berbasis peristiwa, pola sumber acara menyimpan peristiwa yang menghasilkan perubahan status di penyimpanan data. Ini membantu menangkap dan mempertahankan riwayat lengkap perubahan negara, dan mempromosikan auditabilitas, keterlacakan, dan kemampuan untuk menganalisis keadaan masa lalu.
Motivasi
Beberapa layanan mikro dapat berkolaborasi untuk menangani permintaan, dan mereka berkomunikasi melalui acara. Peristiwa ini dapat mengakibatkan perubahan status (data). Menyimpan objek peristiwa dalam urutan di mana mereka terjadi memberikan informasi berharga tentang keadaan saat ini dari entitas data dan informasi tambahan tentang bagaimana ia sampai pada keadaan itu.
Penerapan
Gunakan pola sumber acara saat:
-
Riwayat abadi dari peristiwa yang terjadi dalam aplikasi diperlukan untuk melacak.
-
Proyeksi data polyglot diperlukan dari satu sumber kebenaran (SSOT).
-
Diperlukan rekonstruksi point-in-time dari status aplikasi.
-
Penyimpanan jangka panjang status aplikasi tidak diperlukan, tetapi Anda mungkin ingin merekonstruksinya sesuai kebutuhan.
-
Beban kerja memiliki volume baca dan tulis yang berbeda. Misalnya, Anda memiliki beban kerja intensif tulis yang tidak memerlukan pemrosesan waktu nyata.
-
Change data capture (CDC) diperlukan untuk menganalisis kinerja aplikasi dan metrik lainnya.
-
Data audit diperlukan untuk semua peristiwa yang terjadi dalam suatu sistem untuk tujuan pelaporan dan kepatuhan.
-
Anda ingin menurunkan skenario bagaimana-jika dengan mengubah (menyisipkan, memperbarui, atau menghapus) peristiwa selama proses pemutaran ulang untuk menentukan kemungkinan status akhir.
Masalah dan pertimbangan
-
Kontrol konkurensi optimis: Pola ini menyimpan setiap peristiwa yang menyebabkan perubahan status dalam sistem. Beberapa pengguna atau layanan dapat mencoba memperbarui data yang sama secara bersamaan, menyebabkan tabrakan peristiwa. Tabrakan ini terjadi ketika peristiwa yang saling bertentangan dibuat dan diterapkan pada saat yang sama, yang menghasilkan status data akhir yang tidak sesuai dengan kenyataan. Untuk mengatasi masalah ini, Anda dapat menerapkan strategi untuk mendeteksi dan menyelesaikan tabrakan peristiwa. Misalnya, Anda dapat menerapkan skema kontrol konkurensi optimis dengan menyertakan pembuatan versi atau dengan menambahkan stempel waktu ke acara untuk melacak urutan pembaruan.
-
Kompleksitas: Menerapkan sumber acara memerlukan pergeseran pola pikir dari operasi CRUD tradisional ke pemikiran yang didorong oleh peristiwa. Proses replay, yang digunakan untuk mengembalikan sistem ke keadaan semula, dapat menjadi rumit untuk memastikan idempotensi data. Penyimpanan acara, cadangan, dan snapshot juga dapat menambah kompleksitas tambahan.
-
Konsistensi akhir: Proyeksi data yang berasal dari peristiwa pada akhirnya konsisten karena latensi dalam memperbarui data dengan menggunakan pola pemisahan tanggung jawab permintaan perintah (CQRS) atau tampilan terwujud. Ketika konsumen memproses data dari toko acara dan penerbit mengirim data baru, proyeksi data atau objek aplikasi mungkin tidak mewakili keadaan saat ini.
-
Query: Mengambil data saat ini atau agregat dari log peristiwa bisa lebih rumit dan lebih lambat dibandingkan dengan database tradisional, terutama untuk kueri kompleks dan tugas pelaporan. Untuk mengurangi masalah ini, sumber acara sering diimplementasikan dengan pola CQRS.
-
Ukuran dan biaya toko acara: Toko acara dapat mengalami pertumbuhan eksponensial dalam ukuran karena peristiwa terus berlanjut, terutama dalam sistem yang memiliki throughput acara tinggi atau periode retensi yang diperpanjang. Oleh karena itu, Anda harus mengarsipkan data acara secara berkala ke penyimpanan hemat biaya untuk mencegah toko acara menjadi terlalu besar.
-
Skalabilitas toko acara: Toko acara harus secara efisien menangani volume tinggi dari operasi tulis dan baca. Menskalakan toko acara bisa menjadi tantangan, jadi penting untuk memiliki penyimpanan data yang menyediakan pecahan dan partisi.
-
Efisiensi dan optimasi: Pilih atau rancang toko acara yang menangani operasi tulis dan baca secara efisien. Toko acara harus dioptimalkan untuk volume acara yang diharapkan dan pola kueri untuk aplikasi. Menerapkan mekanisme pengindeksan dan kueri dapat mempercepat pengambilan peristiwa saat merekonstruksi status aplikasi. Anda juga dapat mempertimbangkan untuk menggunakan database toko acara khusus atau pustaka yang menawarkan fitur pengoptimalan kueri.
-
Snapshots: Anda harus mencadangkan log peristiwa secara berkala dengan aktivasi berbasis waktu. Memutar ulang peristiwa pada cadangan data yang berhasil terakhir diketahui akan mengarah pada point-in-time pemulihan status aplikasi. Tujuan titik pemulihan (RPO) adalah jumlah waktu maksimum yang dapat diterima sejak titik pemulihan data terakhir. RPO menentukan apa yang dianggap sebagai hilangnya data yang dapat diterima antara titik pemulihan terakhir dan gangguan layanan. Frekuensi snapshot harian data dan toko acara harus didasarkan pada RPO untuk aplikasi.
-
Sensitivitas waktu: Peristiwa disimpan dalam urutan terjadinya. Oleh karena itu, keandalan jaringan merupakan faktor penting untuk dipertimbangkan ketika Anda menerapkan pola ini. Masalah latensi dapat menyebabkan status sistem yang salah. Gunakan antrian first in, first out (FIFO) dengan at-most-once pengiriman untuk membawa acara ke toko acara.
-
Kinerja pemutaran ulang acara: Memutar ulang sejumlah besar peristiwa untuk merekonstruksi status aplikasi saat ini dapat memakan waktu. Upaya optimasi diperlukan untuk meningkatkan kinerja, terutama saat memutar ulang peristiwa dari data yang diarsipkan.
-
Pembaruan sistem eksternal: Aplikasi yang menggunakan pola sumber acara dapat memperbarui penyimpanan data di sistem eksternal, dan mungkin menangkap pembaruan ini sebagai objek peristiwa. Selama tayangan ulang acara, ini mungkin menjadi masalah jika sistem eksternal tidak mengharapkan pembaruan. Dalam kasus seperti itu, Anda dapat menggunakan bendera fitur untuk mengontrol pembaruan sistem eksternal.
-
Kueri sistem eksternal: Ketika panggilan sistem eksternal sensitif terhadap tanggal dan waktu panggilan, data yang diterima dapat disimpan di penyimpanan data internal untuk digunakan selama pemutaran ulang.
-
Versi acara: Saat aplikasi berkembang, struktur peristiwa (skema) dapat berubah. Menerapkan strategi pembuatan versi untuk acara untuk memastikan kompatibilitas mundur dan maju diperlukan. Ini dapat melibatkan termasuk bidang versi dalam payload acara dan menangani versi acara yang berbeda dengan tepat selama pemutaran ulang.
Implementasi
Arsitektur tingkat tinggi
Perintah dan acara
Dalam aplikasi layanan mikro berbasis peristiwa terdistribusi, perintah mewakili instruksi atau permintaan yang dikirim ke layanan, biasanya dengan maksud memulai perubahan statusnya. Layanan memproses perintah ini dan mengevaluasi validitas dan penerapan perintah ke keadaan saat ini. Jika perintah berjalan dengan sukses, layanan merespons dengan memancarkan peristiwa yang menandakan tindakan yang diambil dan informasi status yang relevan. Misalnya, dalam diagram berikut, layanan pemesanan merespons perintah Book ride dengan memancarkan acara yang dipesan Ride.

Toko acara
Peristiwa masuk ke repositori atau penyimpanan data yang tidak dapat diubah, hanya ditambahkan, diurutkan secara kronologis yang dikenal sebagai toko acara. Setiap perubahan status diperlakukan sebagai objek peristiwa individu. Objek entitas atau penyimpanan data dengan keadaan awal yang diketahui, keadaan saat ini, dan point-in-time tampilan apa pun dapat direkonstruksi dengan memutar ulang peristiwa dalam urutan kemunculannya.
Toko acara bertindak sebagai catatan sejarah dari semua tindakan dan perubahan negara, dan berfungsi sebagai sumber kebenaran tunggal yang berharga. Anda dapat menggunakan toko acara untuk mendapatkan up-to-date status akhir sistem dengan meneruskan peristiwa melalui prosesor replay, yang menerapkan peristiwa ini untuk menghasilkan representasi akurat dari status sistem terbaru. Anda juga dapat menggunakan toko acara untuk menghasilkan point-in-time perspektif status dengan memutar ulang peristiwa melalui prosesor replay. Dalam pola sumber peristiwa, status saat ini mungkin tidak sepenuhnya diwakili oleh objek peristiwa terbaru. Anda dapat memperoleh keadaan saat ini dengan salah satu dari tiga cara:
-
Dengan menggabungkan peristiwa terkait. Objek peristiwa terkait digabungkan untuk menghasilkan status saat ini untuk kueri. Pendekatan ini sering digunakan bersama dengan pola CQRS, di mana peristiwa digabungkan dan ditulis ke dalam penyimpanan data hanya-baca.
-
Dengan menggunakan tampilan yang terwujud. Anda dapat menggunakan sumber peristiwa dengan pola tampilan terwujud untuk menghitung atau meringkas data peristiwa dan mendapatkan status data terkait saat ini.
-
Dengan memutar ulang acara. Objek acara dapat diputar ulang untuk melakukan tindakan untuk menghasilkan keadaan saat ini.
Diagram berikut menunjukkan Ride booked
acara yang disimpan di toko acara.

Toko acara menerbitkan acara yang disimpannya, dan acara dapat disaring dan diarahkan ke prosesor yang sesuai untuk tindakan selanjutnya. Misalnya, peristiwa dapat dirutekan ke prosesor tampilan yang merangkum status dan menunjukkan tampilan yang terwujud. Peristiwa diubah ke format data penyimpanan data target. Arsitektur ini dapat diperluas untuk memperoleh berbagai jenis penyimpanan data, yang mengarah pada persistensi data polyglot.
Diagram berikut menjelaskan peristiwa dalam aplikasi pemesanan perjalanan. Semua peristiwa yang terjadi dalam aplikasi disimpan di toko acara. Peristiwa yang disimpan kemudian disaring dan diarahkan ke konsumen yang berbeda.

Peristiwa perjalanan dapat digunakan untuk menghasilkan penyimpanan data hanya-baca dengan menggunakan CQRS atau pola tampilan terwujud. Anda dapat memperoleh status perjalanan saat ini, pengemudi, atau pemesanan dengan menanyakan toko baca. Beberapa peristiwa, seperti Location changed
atauRide completed
, dipublikasikan ke konsumen lain untuk diproses pembayaran. Ketika perjalanan selesai, semua acara perjalanan diputar ulang untuk membangun riwayat perjalanan untuk tujuan audit atau pelaporan.
Pola sumber peristiwa sering digunakan dalam aplikasi yang memerlukan point-in-time pemulihan, dan juga ketika data harus diproyeksikan dalam format yang berbeda dengan menggunakan satu sumber kebenaran. Kedua operasi ini memerlukan proses pemutaran ulang untuk menjalankan acara dan mendapatkan status akhir yang diperlukan. Prosesor replay mungkin juga memerlukan titik awal yang diketahui — idealnya bukan dari peluncuran aplikasi, karena itu tidak akan menjadi proses yang efisien. Kami menyarankan Anda mengambil snapshot reguler dari status sistem dan menerapkan sejumlah kecil peristiwa untuk mendapatkan status. up-to-date
Implementasi menggunakan layanan AWS
Dalam arsitektur berikut, Amazon Kinesis Data Streams digunakan sebagai toko acara. Layanan ini menangkap dan mengelola perubahan aplikasi sebagai peristiwa, dan menawarkan solusi streaming data throughput tinggi dan real-time. Untuk menerapkan pola sumber acara di AWS, Anda juga dapat menggunakan layanan seperti Amazon EventBridge dan Amazon Managed Streaming for Apache Kafka (Amazon MSK) berdasarkan kebutuhan aplikasi Anda.
Untuk meningkatkan daya tahan dan mengaktifkan audit, Anda dapat mengarsipkan peristiwa yang ditangkap oleh Kinesis Data Streams di Amazon Simple Storage Service (Amazon S3). Pendekatan penyimpanan ganda ini membantu menyimpan data peristiwa historis dengan aman untuk tujuan analisis dan kepatuhan di masa mendatang.

Alur kerja terdiri dari langkah-langkah berikut:
-
Permintaan pemesanan perjalanan dilakukan melalui klien seluler ke titik akhir Amazon API Gateway.
-
Layanan mikro perjalanan (fungsi
Ride service
Lambda) menerima permintaan, mengubah objek, dan menerbitkan ke Kinesis Data Streams. -
Data peristiwa di Kinesis Data Streams disimpan di Amazon S3 untuk tujuan kepatuhan dan riwayat audit.
-
Peristiwa diubah dan diproses oleh fungsi
Ride event processor
Lambda dan disimpan dalam database Amazon Aurora untuk memberikan tampilan terwujud untuk data perjalanan. -
Acara perjalanan yang telah selesai disaring dan dikirim untuk diproses pembayaran ke gateway pembayaran eksternal. Ketika pembayaran selesai, acara lain dikirim ke Kinesis Data Streams untuk memperbarui database Ride.
-
Ketika perjalanan selesai, acara perjalanan diputar ulang ke fungsi
Ride service
Lambda untuk membangun rute dan sejarah perjalanan. -
Informasi perjalanan dapat dibaca melalui
Ride data service
, yang dibaca dari database Aurora.
API Gateway juga dapat mengirim objek acara langsung ke Kinesis Data Streams tanpa fungsi LambdaRide service
. Namun, dalam sistem yang kompleks seperti layanan ride hailing, objek acara mungkin perlu diproses dan diperkaya sebelum tertelan ke dalam aliran data. Untuk alasan ini, arsitektur memiliki Ride service
yang memproses peristiwa sebelum mengirimnya ke Kinesis Data Streams.