Cari lintas data lintas beberapa layanan microser

13

Saya memiliki data untuk domain tertentu yang didistribusikan antara layanan microser dan database lama. Saya memiliki pencarian yang membentang bidang pada basis data legacy dan microservice. Sebelumnya (sebelum pemisahan microservice), itu dilakukan dengan 1 permintaan sql. Sekarang saya memerlukan panggilan REST dan kueri ke database lama untuk melayani fungsi pencarian ini. Kita berbicara tentang beberapa juta baris di sini. Bagaimana saya bisa membuat model terbaik ini? Karena volume data, panggilan REST mengembalikan hasil paginasi biasanya juga. Pendekatan naif untuk menjalankan panggilan SQL dan menggabungkan dan menggabungkan hasil dengan respon REST terlalu lambat dan tidak terlalu praktis.

senseiwu
sumber

Jawaban:

21

Fitur pencarian dapat dimodelkan sebagai layanan terpisah dengan tanggung jawab terpisah dari dua layanan yang Anda sebutkan. Jadi, pendekatan di sini mungkin untuk membuat layanan baru ('pencarian') dan minta ia menyimpan salinan data dari kedua layanan dalam bentuk yang mudah untuk diindeks dan dicari, mungkin juga didenormalisasi untuk dengan cepat memberikan hasil dalam format yang diinginkan.

Jadi, misalnya Anda dapat memiliki database SQL lama menggunakan mis mySql, layanan microser lainnya menggunakan misal MongoDB, dan layanan pencarian baru menggunakan elasticsearch dengan data dari keduanya yang sudah ditempelkan bersama (didenormalkan) untuk akses yang lebih nyaman. tentu saja detailnya akan tergantung pada jenis pencarian yang perlu Anda lakukan.

Data dari dua layanan sebaiknya ditransfer secara tidak sinkron ke indeks pencarian melalui bus peristiwa seperti Kafka atau Hermes untuk meningkatkan throughput dan mengurangi sambungan antara layanan. Perubahan di salah satu dari dua layanan ini akan mengirim acara yang menginformasikan layanan pencarian untuk juga memperbarui datanya.

Tentu saja ada biaya keterlambatan tambahan antara perubahan dalam layanan dan dalam layanan pencarian, tetapi karena layanan microser biasanya digunakan dalam sistem yang didistribusikan, beberapa penundaan dan inkonsistensi sementara tidak dapat dihindari. Memiliki layanan tambahan dan menggunakan penyimpanan ekstra untuk salinan data yang sudah ada di dua layanan lainnya juga merupakan biaya khas untuk memiliki sistem yang sangat terdistribusi dan dapat diskalakan menggunakan layanan microser.

Michał Kosmulski
sumber
Namun saya sudah tentang membuat layanan terpisah. Satu-satunya hal yang memberi saya sedikit ketidaknyamanan - membuat database lain hanya untuk pencarian (memasukkannya ke elastis akan menjadi pilihan lain, tetapi kami memiliki beberapa hambatan infrastruktur)
senseiwu
7
@ zencv Sayangnya, layanan microser datang dengan biaya seperti ini. Mampu skala secara horizontal berarti kopling harus lemah dan ini berarti sering akan ada duplikasi data. Anda juga mendapatkan lebih banyak lalu lintas jaringan. Skalabilitas seringkali berarti penurunan kinerja per perangkat keras dan memilih satu arsitektur di atas yang lain (mis. Layanan microser vs monolith) harus mempertimbangkan pertukaran ini.
Michał Kosmulski