Layanan mikro dan replikasi data

14

Saya sedang membangun aplikasi baru dan sedang membaca tentang arsitektur layanan mikro. Arsitekturnya sendiri sangat masuk akal dari sudut pandang pengembangan, penyebaran, dan manajemen siklus hidup. Namun satu masalah yang muncul adalah tentang bagaimana menangani data master.

Misalnya, saya memiliki 2 aplikasi - katakan aplikasi Penjualan dan aplikasi Tiket. Anggap kedua aplikasi ini dibangun sebagai layanan mikro sendiri. Namun kedua aplikasi ini, ketika digunakan (dengan asumsi bahwa mereka dikerahkan secara terpisah mengatakan Penjualan menggunakan MongoDB dan Tiket menggunakan MariaDB), perlu memiliki akses ke instance data master yang sama misalnya Akun, Produk. Ini berarti bahwa akan ada aplikasi pemilik untuk entitas data master yang diberikan (misalnya untuk Akun mungkin adalah aplikasi Penjualan) dan pihak yang berkepentingan (misalnya aplikasi Tiket perlu memiliki informasi tentang Akun).

Ada beberapa cara untuk mencapai hal ini: - Replikasi data dari master ke pihak yang berkepentingan - Pembacaan sinkron dari pihak yang berkepentingan ke master (ketergantungan sinkronisasi tidak direkomendasikan oleh paradigma arsitektur layanan mikro) - Repositori terpusat sendiri

Bahkan di dalam Akun, ada bagian inti yang umum untuk Penjualan dan Tiket (mis. Nama akun, alamat, dll.). Namun beberapa aspek dari Akun HANYA mungkin relevan untuk Penjualan dan yang lainnya HANYA relevan untuk Tiket.

Adakah pemikiran / praktik terbaik / pendapat mengenai salah satu opsi yang disebutkan di atas?

mithrandir
sumber
Tidak bisakah Anda membuat Akun dan Produk sebagai layanan mikro juga? Memisahkan mereka sepenuhnya dari "entitas data master". Penjualan hanya akan tahu tentang penjualan beberapa jenis entitas, tetapi tidak perlu tahu apakah entitas tersebut adalah Produk, Layanan, atau jenis entitas lain apa pun yang mungkin ingin Anda tambahkan nanti.
bleakgadfly
Ya, itu mungkin. Namun di sini sekali lagi tantangannya adalah bahwa layanan 'Akun' pusat harus dimodelkan secara super-set (yaitu harus mempertimbangkan atribut untuk Penjualan, Tiket dll). Ini akan bertentangan dengan paradigma SRP.
mithrandir

Jawaban:

12

Saya adalah bagian dari tim yang berhasil membangun arsitektur layanan mikro menggunakan bus layanan.

Awalnya, kami percaya bahwa layanan microser dan arsitektur berbasis peristiwa akan memungkinkan kami untuk memperbaiki basis data ball-of-mud data yang mendasarinya.

Apa yang kami pelajari adalah bahwa layanan microser dan arsitektur yang digerakkan oleh peristiwa mengharuskan kami untuk menyingkirkan basis data ball-of-mud yang mendasarinya.

Saya percaya bahwa data yang dibagikan sangat sulit dilakukan dengan baik dengan layanan microser - bagi saya itu sangat sulit. Saya sarankan tidak mengizinkan layanan untuk melihat data satu sama lain. Jika Anda tidak dapat menanyakannya, Anda tidak dapat secara tidak sengaja memperkenalkan dependensi.

Jika Anda melakukan data saham, tentu hanya satu layanan pernah bisa SENDIRI rekor; itu adalah satu-satunya layanan yang menulis ke catatan, dan setiap pengguna lain dari data yang sama harus memiliki akses hanya baca.

Sayangnya, bahkan jumlah yang dikelola yang kecil ini memberikan penggabungan yang signifikan antara layanan Anda. Bagaimana jika satu layanan tidak menginginkan data dalam bentuk itu? Mungkin ingin agregasi. Apakah Anda mendapatkan layanan "pemilik / tulis" untuk menulis data agregat untuk kepentingan layanan lain? Saya tidak menyarankan.

Bagaimana jika pemilik ingin mempertahankan data dalam bentuk yang berbeda? Maka setiap layanan pembaca perlu diperbarui. Itu mimpi buruk pemeliharaan.

Solusi terbaik yang kami miliki adalah duplikasi dan denormalisasi data yang signifikan. Layanan mikro menyimpan salinan data mereka sendiri yang mereka pedulikan.

Pesan sering diterbitkan dengan data yang cukup untuk memprosesnya.

Misalnya, Anda mungkin membayangkan bahwa layanan pengiriman pos mungkin perlu melacak perubahan ke alamat pelanggan, jika perlu memposting sesuatu. Tetapi jika pesan "item ready for despatch" Anda menyertakan alamat tujuan sebagai bagian dari data pesan, maka layanan pengiriman tidak perlu lagi melacak perubahan alamat yang terkait dengan pelanggan sama sekali; cukup arahkan alamat yang terkait dengan barang saat dikirim.

Saya tidak bisa menyarankan cara merancang solusi dengan data yang disinkronkan. Solusi data kami dibangun di sekitar gagasan "konsistensi akhirnya".

Jadi, ketika pelanggan memperbarui alamat mereka, layanan Alamat memproses perintah awal dari UI. Setelah datanya benar, ia menerbitkan suatu acara untuk memberi tahu semua layanan lain yang tertarik "Alamat Pelanggan Diperbarui" - dengan alamat lengkap terlampir sebagai data. Layanan tersebut akan memperbarui penyimpanan data mereka sendiri dengan bagian-bagian dari data yang mereka pedulikan.

Idenya adalah bahwa setiap kali suatu layanan harus mengambil tindakan penting, ia harus memiliki salinan informasi yang terkini untuk bertindak dengan benar, baik dilacak secara mandiri, atau sebagai bagian dari pesan yang ditanggapi.

perfeksionis
sumber
Apakah Anda menggunakan solusi buatan sendiri atau yang lain?
FrEaKmAn
2
Kami menggunakan NServiceBus - yang memperkenalkan ide / struktur untuk mengatasi alur kerja yang terjadi di setiap layanan. Kegigihan bisa terjadi melalui RavenDB. Anda mungkin menemukan Anda tidak ingin memilih teknologi terlalu dini - keadaan Anda mungkin berbeda dan kami memiliki masalah gigi. Martin Fowler memiliki beberapa saran yang sangat bagus untuk orang-orang yang memulai dengan layanan microser: martinfowler.com/articles/microservices.html - "... Anda tidak boleh memulai dengan arsitektur layanan microser. Alih-alih mulailah dengan monolit, pertahankan modular, dan pisahkan itu menjadi microservices begitu monolith menjadi masalah. "
perfeksionis
Singkatnya, " Solusi terbaik yang kami miliki adalah duplikasi dan denormalisasi data kami secara signifikan. Layanan mikro mempertahankan salinan data mereka sendiri yang mereka pedulikan. "
deFreitas
2

Penyimpanan data bersama akan bertentangan dengan arsitektur layanan mikro. Intinya adalah jika ada Akun, harus ada layanan untuk menanganinya dan seharusnya tidak ada cara lain untuk berinteraksi dengan Akun ini selain layanan menyeluruh. Layanan microser Anda tidak akan independen jika mereka berbagi penyimpanan bersama dan setiap perubahan pada mekanisme penyimpanan, validasi, atau kendala lain harus diimplementasikan di kedua layanan. Dalam praktiknya ini tidak pernah terjadi dan segera menyebabkan kedua aplikasi dicegah dari perubahan serius.

Jadi, gunakan layanan sebagai satu-satunya cara mengakses data Anda, mis. Akun. Mungkin saja menerapkan fitur di beberapa layanan lain memerlukan perubahan pada layanan Akun, dan itu tidak masalah. Ingatlah bahwa logika khusus untuk layanan apa pun harus dalam layanan itu dan sesedikit mungkin hal spesifik harus masuk ke dalam layanan akun mikro.

Michał Kosmulski
sumber
0

perlu memiliki akses ke instance data master yang sama misalnya Akun, Produk

Tidak sama. Setiap layanan mikro harus melakukan pemetaan sendiri untuk Akun, Produk, dll. Kami mengasumsikan bahwa setiap layanan mikro akan memiliki cara yang berbeda untuk bekerja dengan entitas.

Di Domain Driven Design, ini adalah hal biasa, di mana setiap konteks yang dibatasi (dalam aplikasi yang sama!) Dapat memetakan entitas yang sama dengan cara yang berbeda.

Jika Anda memerlukan informasi lebih lanjut, saya merekomendasikan buku Building Microservices: Designing Fine-Grained Systems

Dherik
sumber
0

Sudahkah Anda mempertimbangkan konsep catatan kerangka berdasarkan master set?

Misalnya satu layanan microser menangani akun dan yang lainnya menangani produk. Yang ketiga dapat menyimpan catatan dari keduanya untuk tujuan spesifik domainnya.

Robert Christian
sumber