Saya relatif baru dalam arsitektur layanan mikro. Kami memiliki aplikasi web berukuran sedang dan saya menimbang pro dan kontra memecahnya menjadi layanan microser, bukan sistem monolitik yang kami miliki sekarang bergerak maju.
Sejauh yang saya mengerti, pertimbangkan microservices A
dan B
masing-masing mengandalkan subset data yang dimiliki oleh yang lain. Jika sebuah pesan diposkan dengan A
mengatakan bahwa sesuatu telah berubah, B
dapat menggunakan pesan itu dan mereplikasi salinan lokal A
info dan menggunakannya untuk melakukan apa pun yang B
perlu dilakukan.
Namun, bagaimana jika B
turun / gagal dan setelah beberapa saat, muncul kembali. Selama waktu itu, A
telah menerbitkan dua pesan lagi. Bagaimana cara B
mengetahui cara memperbarui salinan A
info lokalnya ?
Memang, jika B
hanya konsumen dari A
antrian, maka ia dapat mulai membacanya begitu kembali online tetapi bagaimana jika ada konsumen lain dari antrian itu dan pesan-pesan itu dikonsumsi?
Sebagai contoh yang lebih konkret, jika suatu Users
layanan memperbarui alamat emailnya sementara layanan Billing
mikro turun, jika layanan Billing
mikro muncul kembali, bagaimana ia tahu bahwa email telah diperbarui?
Ketika layanan microser muncul kembali, apakah ia melakukan siaran yang mengatakan, "Hai, saya kembali, berikan saya semua info Anda saat ini?"
Secara umum apa yang akan menjadi praktik industri terbaik untuk sinkronisasi data?
sumber
Orders
perlu tahu tentangUsers
?Jawaban:
Saya akan menantang seluruh gagasan Anda tentang "mendorong data ke semua layanan microser lainnya".
Biasanya, jika layanan penagihan membutuhkan alamat email, ia hanya meminta layanan alamat untuk alamat email pelanggan tertentu. Tidak perlu memiliki salinan dari semua data alamat dan tidak akan diinformasikan jika ada perubahan. Itu hanya bertanya dan mendapat jawaban dari data terbaru.
sumber
Setelah melakukan sedikit riset lebih lanjut, saya menemukan artikel ini dari mana saya menarik beberapa kutipan yang menurut saya bermanfaat untuk apa yang ingin saya capai (dan untuk pembaca masa depan). Ini menawarkan cara untuk mengadopsi model pemrograman reaktif daripada model pemrograman imperatif.
Sumber acara
Apa yang membantu ini capai adalah bahwa jika suatu layanan mikro turun namun peristiwa lain yang berkaitan dengannya sedang diterbitkan dan peristiwa-peristiwa dikonsumsi oleh, katakanlah, contoh-contoh lain dari layanan mikro itu, ketika layanan mikro itu muncul kembali, itu dapat merujuk pada ini
event store
untuk mengambil semua peristiwa yang terjawab selama periode itu turun.Apache Kafka sebagai Perantara Acara
Pertimbangkan penggunaan Apache Kafka yang dapat menyimpan dan mengirim ribuan acara per detik dan memiliki mekanisme replikasi dan toleransi kesalahan yang terintegrasi. Ini memiliki penyimpanan peristiwa yang dapat disimpan di disk tanpa batas dan dikonsumsi kapan saja (tetapi tidak dihapus) dari Topik (antrian mewah Kafka) dikirim ke.
Bahkan, ketika konsumen mengidentifikasi diri mereka ke Kafka, Kafka akan merekam pesan mana yang dikirimkan ke konsumen mana sehingga tidak melayani lagi.
Sagas
Saat itulah saga ikut bermain. Saga adalah urutan transaksi lokal. Setiap transaksi lokal memperbarui basis data dan menerbitkan pesan atau peristiwa untuk memicu transaksi lokal berikutnya dalam kisah tersebut. Jika transaksi lokal gagal karena melanggar aturan bisnis maka hikayat tersebut melakukan serangkaian transaksi kompensasi yang membatalkan perubahan yang dilakukan oleh transaksi lokal sebelumnya. Baca ini untuk info lebih lanjut.
sumber
Bahkan jika saya terlambat, saya akan mengajukan 2 sen saya pada argumen karena saya pikir itu poin penting ketika Anda ingin mengevaluasi e merancang arsitektur microservices yang digerakkan oleh peristiwa. Setiap microservice tahu persis peristiwa apa yang berdampak pada keadaannya dan dapat menunggu mereka. Ketika layanan Microsoft tidak tersedia, harus ada komponen yang menyimpan pesan yang diperlukan dari layanan Microsoft yang gagal hingga tidak dapat "mengkonsumsinya". Ini sebenarnya adalah model "produsen / konsumen" dan bukan "publikasikan / berlangganan". Pialang pesan (seperti Kafka, RabbitMQ, ActiveMQ dll.) Biasanya merupakan cara terbaik untuk mencapai perilaku ini (kecuali jika Anda tidak mengimplementasikan sesuatu yang berbeda seperti event sourcing) menyediakan antrian persisten dan mekanisme ack / nack.
Sekarang layanan mikro tahu bahwa suatu pesan pada akhirnya dikirimkan tetapi itu tidak cukup: yang mana ia mengharapkan pengiriman satu pesan? dapatkah ia mengelola pengiriman beberapa salinan dari pemberitahuan acara yang sama? Ini masalah pengiriman semantik (setidaknya sekali, tepat sekali)
Pemikiran akhir:
Ketika Anda menambahkan microservice ke arsitektur Anda yang perlu mengkonsumsi acara dari orang lain, Anda harus melakukan sinkronisasi pertama
Bahkan broker dapat gagal, dalam hal ini pesan hilang
untuk kedua skenario, akan bermanfaat untuk memiliki mekanisme sederhana untuk menghidrasi ulang kondisi layanan mikro Anda. Itu bisa berupa REST API atau skrip yang mengirim pesan, tetapi yang paling penting adalah memiliki sarana untuk melakukan beberapa tugas pemeliharaan
sumber
Anda dapat mengganti antrian acara normal dengan model penerbit / pelanggan, di mana
A
layanan mempublikasikan pesan baru topik T danB
jenis layanan mikro akan berlangganan ke topik yang sama.Idealnya
B
adalah layanan tanpa kewarganegaraan, dan itu akan menggunakan layanan ketekunan yang terpisah, sehinggaB
contoh layanan yang gagal akan diganti dengan menelurkan satu atau lebihB
contoh layanan untuk melanjutkan pekerjaannya, membaca dari layanan ketekunan bersama yang sama.sumber
Jika Anda ingin B dapat mengakses data internal A, Anda akan lebih baik memberikannya akses ke basis data internal A.
Namun Anda tidak boleh melakukan itu, inti dari arsitektur berorientasi layanan adalah bahwa layanan B tidak dapat melihat status internal layanan A dan terbatas untuk membuat permintaan melalui REST APIs (dan sebaliknya).
Dalam kasus Anda, Anda dapat memiliki layanan data pengguna, yang memiliki tanggung jawab menyimpan semua data pengguna. Layanan lain yang ingin menggunakan data itu hanya memintanya ketika mereka membutuhkannya dan tidak menyimpan salinan lokal (yang sebenarnya sangat berguna jika Anda berpikir tentang kepatuhan GDPR). Layanan Data Pengguna dapat mendukung operasi CRUD sederhana seperti "Buat pengguna baru", atau "Ubah nama untuk pengguna_id 23" atau dapat memiliki operasi yang lebih kompleks, "Temukan semua pengguna standar dengan ulang tahun yang akan datang dalam 2 minggu ke depan dan berikan kepada mereka status uji coba premium ". Sekarang ketika layanan Penagihan Anda perlu mengirim email ke pengguna 42, ia akan meminta layanan Data Pengguna "Apa alamat email untuk user_id 42", gunakan data internalnya dengan semua informasi penagihan untuk membuat email dan kemudian dapat melewati alamat email dan isi ke server email.
sumber