Layanan Mikro - ganti rugi kegagalan layanan dengan antrian

8

Kami menggunakan semacam pendekatan layanan mikro di aplikasi kami (meskipun tidak benar-benar dipatuhi secara konsekuen).

Ketika layanan turun atau melempar pengecualian, pendekatannya adalah memasukkannya ke dalam antrian (ActiveMQ), dan coba lagi ketika layanan lagi.

Apakah ini solusi "standar"? Atau haruskah itu dihindari karena alasan tertentu?

Atau adakah solusi yang lebih baik, atau alternatif untuk masalah ini?

pengguna140547
sumber
Apa masalah dengan solusi saat ini? Solusi terbaik / lebih baik adalah yang benar-benar sesuai dengan kebutuhan Anda. Lakukan yang sekarang?
Laiv
@Laiv: Tidak ada masalah, tetapi karena saya tidak berpengalaman dengan arsitektur itu, saya hanya bertanya, apakah ada masalah potensial atau keterbatasan dari pendekatan ini yang harus dipertimbangkan.
user140547
Apa yang terjadi jika antrian turun?
Jon Raynor
@JonRaynor: menyerah dan mengembalikan kesalahan, karena mungkin akan membutuhkan banyak tenaga untuk mengimplementasikan mekanisme fallback kedua ...
user140547

Jawaban:

3

Dengan asumsi Anda dapat membuat panggilan Anda tidak sinkron (Anda tidak perlu mendapatkan respons dari layanan untuk melanjutkan), melakukan hal itu sering kali merupakan ide yang baik.

Ini memungkinkan layanan panggilan untuk terus bekerja tanpa penundaan (atau kesalahan langsung) yang disebabkan oleh panggilan layanan lainnya. Ini memungkinkan Anda untuk memiliki logika coba lagi yang lebih kompleks dan untuk menyebarkan beban lebih merata dari waktu ke waktu.

Untuk banyak kasus, Anda bisa mendapatkan lebih banyak dari itu dengan menyerah pada jaminan pemesanan yang diberikan oleh antrian dan beralih ke Kafka atau broker pesan asinkron lainnya. Hermes menyediakan REST API yang lebih nyaman di atas Kafka.

Michał Kosmulski
sumber
Saya memilih jawaban ini dengan asumsi konteksnya adalah bahwa kita berbicara tentang klien. Ini sebenarnya bukan pertanyaan layanan mikro. Ini keputusan desain klien. Jika layanan baik sinkron atau tidak dan itu baik atau tidak. Itu tidak secara jelas dijabarkan dalam pertanyaan tetapi itu benar-benar masuk akal jika kita berbicara tentang klien.
JimmyJames
3

Ini adalah pendekatan yang buruk menurut saya. kamu juga harus

  • Selalu berkomunikasi melihat antrian: Aplikasi Anda seharusnya tidak mengharapkan respons segera dan karenanya proses pekerja tidak harus 100% tersedia

  • Selalu gunakan komunikasi gaya RPC. Muat permintaan keseimbangan di beberapa instance layanan: Jika suatu layanan salah, yang lain akan menjawab permintaan tersebut, sehingga Anda memiliki waktu aktif 100%

Memiliki alur, layanan panggilan, mendapatkan kesalahan, tempat dalam antrian, ingat untuk memeriksa antrian untuk balasan ke beberapa pesan saya untuk tetapi tidak semuanya. sudah terlalu rumit.

sunting: terlalu rumit karena Anda harus memprogram sinkronisasi dan gaya komunikasi asink daripada hanya satu atau yang lain.

Ewan
sumber
Saya agak setuju dengan ini. Itu lebih rumit. Entah itu terlalu rumit sulit untuk mengevaluasi tanpa memahami arsitektur yang lebih besar. Masalah dengan pergi berdasarkan 100% antrian adalah bahwa hal itu menambah satu titik kegagalan baru dan menciptakan beberapa tantangan lain. Misalnya, jika proses Anda kewalahan dengan tugas-tugas, menulis ke antrian umumnya sangat cepat sehingga tidak ada masalah pada sisi input sampai booming antrian terisi. Jika sumber permintaan tidak dapat dibatasi, Anda dapat memiliki masalah besar. Tidak dapat diatasi tetapi menambah kompleksitasnya sendiri.
JimmyJames
Jika saya bisa, saya sarankan menulis ulang kalimat terakhir. 'Mengingat' tidak benar-benar masalah di sini, setelah kode ditulis untuk membaca dari antrian, tidak ada yang perlu diingat. Ini hanya kode tambahan untuk ditulis dan dipelihara tetapi seharusnya tidak terlihat jauh berbeda dari apa yang akan Anda miliki jika Anda selalu membaca dari antrian.
JimmyJames
di satu-satunya kesalahan goto antrian senario DAN Anda ingin balasan Anda harus menulis cek antrian DAN penanganan respons segera. Jadi, Anda harus 'ingat' panggilan salah itu dan bukan yang langsung
Ewan
@ Jimmy Anda mendapatkan masalah dengan solusi apa pun. selalu antri, kadang-kadang antrian atau semua RPC.
Ewan
Anda benar-benar tidak memiliki beberapa masalah ini ketika Anda produsen sedang menunggu konsumen. Misalnya, jika Anda menerima maksimal 1000 permintaan per detik, dan kapasitas internal proses Anda turun menjadi 100 per detik, produsen Anda akan diblokir dengan pendekatan langsung. Mereka akan dibatasi juga. Jika Anda cukup memasukkan antrian di tengah, produsen umumnya tidak akan terpengaruh oleh penurunan kapasitas dan terus pada tingkat maksimalnya. Antrean akan terisi hingga Anda mencapai batas kapasitasnya dan penulisan mulai gagal (1000 kegagalan per detik.)
JimmyJames