Saat ini saya memiliki dua layanan microser. Kami akan memanggil mereka A
dan B
.
Database di bawah microservice A
memiliki tabel berikut:
A
|-- users
Database di bawah microservice B
memiliki tabel berikut:
B
|-- trackers
Persyaratan menyatakan itu users
dan trackers
memiliki hubungan banyak-ke-banyak.
Saya tidak yakin bagaimana menangani dengan benar ini dalam arsitektur layanan microser.
Saya bisa melihat ini bekerja dengan satu dari tiga cara:
- Sebuah
user_trackers
tabel ditambahkan ke microserviceA
. Tindakan ini mirip dengan tabel gabungan yang berisi "kunci asing" keusers
dantrackers
. - Sebuah
owners
tabel ditambahkan ke microserviceB
. Tabel ini bertindak mirip dengan tabel gabungan polimorfik. Ini akan memungkinkan layanan apa pun untuk membuat asosiasi dengan pelacak. Ini mungkin terlihat seperti ini:B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
- Menyimpan catatan untuk
users
dantrackers
di setiap layanan microser. Tetap sinkronkan dengan semacam sistem pubsub.
Saya awalnya akan pergi dengan opsi 2 karena saya suka itu mempertahankan batas transaksi. Saya dapat membuat pelacak dan mengaitkannya dengan sesuatu secara atom. Namun, tampaknya di luar ruang lingkup untuk layanan Microsoft B
. Mengapa harus B
layanan microservice bahwa microservice A
ingin membuat asosiasi?
Saya merasa mungkin ada pola yang baik di sini yang tidak saya sadari. Apakah ada opsi yang saya paparkan masuk akal? Apakah ada opsi lain yang lebih masuk akal?
sumber
Jawaban Zapadlo memiliki banyak informasi bagus dan alasan di dalamnya. Saya akan menambahkan sedikit saran praktis di sini yang mungkin membuatnya lebih mudah untuk mengatasi masalah Anda dan saran dalam jawaban itu.
Cara Anda membingkai pertanyaan desain di sekitar struktur basis data dan bagaimana menyesuaikan persyaratan baru untuk struktur Anda ke dalamnya. Ini menyiratkan bahwa Anda sedang membangun desain layanan dari model data Anda. Misalnya, yang tidak saya lihat adalah bagaimana hubungan antara pengguna dan pelacak diakses atau digunakan.
Dalam desain layanan, struktur antarmuka adalah hal yang paling penting tentang desain. Kenyataannya, implementasinya hampir tidak relevan dibandingkan khususnya dalam hal layanan-layanan mikro. Alasannya adalah begitu Anda menempatkan layanan Anda di tempat, semua ketergantungan pada layanan Anda harus ada pada antarmuka saja. Jika Anda melakukannya dengan benar, Anda harus dapat sepenuhnya menulis ulang implementasi tanpa konsumen. Dan itulah manfaat utama otonomi. Tidak ada yang peduli bagaimana Anda membangunnya. Mereka hanya perlu bekerja sesuai dengan cara Anda mengkomunikasikannya.
Sebelum siapa pun dapat menentukan bagaimana ini terlihat dalam database atau di mana Anda menginginkan ini, Anda benar-benar perlu menjelaskan bagaimana informasi ini akan digunakan. Apakah ini sesuatu yang akan diekspos melalui layanan atau itu semacam data yang ingin Anda abaikan untuk analisis?
Di samping catatan, saya akan menghindari ketergantungan dua arah di hampir semua biaya. Jika Anda memiliki dependensi, Anda benar-benar hanya ingin satu sisi tahu tentang yang lain. Setelah dependensi berada di kedua arah, layanan mereka pada dasarnya menjadi unit atom.
sumber
Banyak yang turun ke domain itu sendiri. Jika pengguna dengan nol pelacak tidak masuk akal maka layanan pengguna perlu tahu tentang pelacak. Jika pelacak harus memiliki pengguna maka pelacak perlu tahu tentang pengguna. Jika sesuatu seperti memiliki pelacak dengan beberapa pemilik atau dapat mentransfer pelacak dari satu pengguna ke pengguna lain masuk akal maka mungkin informasi ini termasuk dalam layanan lain.
sumber
Pertanyaan: Mengapa data Anda dipisahkan di sepanjang Datatables?
Saya cenderung memilih opsi 3: layanannya benar-benar terpisah dan dapat menjawab pertanyaan masing-masing yang mungkin perlu mereka jawab. Selain itu, mereka jauh lebih tangguh. Tapi hati-hati, layanan Anda dapat menyinkronkan jika mereka melewatkan acara, tetapi itu bisa diselesaikan melalui konsistensi akhirnya.
Juga, Anda dapat mempertimbangkan untuk menggabungkan kedua layanan - jika keduanya tidak dapat menjawab tanpa mengetahui satu sama lain, saya hanya akan menggabungkan mereka karena mereka mungkin merupakan bagian dari satu domain.
sumber