Bagaimana Anda merancang perangkat lunak Anda yang memperbarui beberapa layanan microser, jika salah satunya gagal?

12

Apakah ada pola atau praktik desain yang dapat saya gunakan untuk membantu layanan yang turun atau turun, sementara yang lain stabil?

Bagaimana jika saya memiliki tiga layanan mikro, dan dua di antaranya bagus, dan satu mati tepat di tengah POST? Dua akan mendapatkan POST dan satu tidak. Saya rasa saya tidak bisa melakukan transaksi karena saya mengirimkan permintaan saya ke suatu layanan.

Bagaimana saya mendesain untuk itu? Saya tidak ingin data anak yatim di berbagai database.

johnny
sumber
6
Ini bukan masalah sederhana untuk dipecahkan. Saya telah melihatnya diimplementasikan sebagai antrian ke layanan (akhirnya konsistensi), karena kemungkinan besar, Anda tidak mengendalikan layanan (s), dan memaksakan manajer transaksi atau kemampuan transaksional adalah omong kosong terbaik, dan mungkin bukan ide yang baik dalam lingkungan SOA. Saya sering melihat ini di sekitar push seluler, di mana Anda mungkin atau mungkin tidak memiliki koneksi ke tujuan Anda.
Mike
acid over microservices adalah kacang yang sulit untuk dipecahkan, opsi lain mungkin semacam bus, menggunakan redis publish / subscribe atau desain antrian dan posting sekali dari saluran masuk, maka layanan berlangganan atau proxy layanan Anda mendorong ke target dan melaporkan keberhasilan kegagalan. Anda harus memantau kegagalan dan memiliki alur untuk itu juga. Anda juga dapat mengalami kegagalan di mana transaksi tidak valid pada satu layanan tetapi berlaku pada dua layanan lain tetapi hanya aliran kegagalan lain yang harus Anda atasi.
Tim Cederquist
Tidak akan menggunakan sesuatu seperti "manajer antrian," yang saya kira Redis akan menyebabkan kemacetan? Atau setidaknya punya potensi tinggi juga? Saya tahu tidak ada cara lain selain yang Anda jelaskan.
johnny
Bergantung pada volume aliran data, saya telah mengimplementasikan manajer antrian, yang mencoba ulang transmisi hingga laporan berhasil atau memposting pemberitahuan gagal dan mengirimkan peringatan SMS tentang pemadaman. Saya kira itu akan tergantung sedikit pada jendela pemadaman yang diharapkan juga (berapa lama).
htm11h
Apakah ini untuk rabbitmq?
johnny

Jawaban:

9

Beberapa opsi.

Gunakan saluran komunikasi yang gigih

Alih-alih HTTP, letakkan pesan dalam antrian yang sangat tersedia dan persisten. Misalnya Kafka. Selama server target tersedia di beberapa titik, itu akan mendapatkan pesan.

Anda memiliki trade-off dari sekarang penyediaan dan administrasi subsistem yang kompleks (antrian). Jadi pastikan Anda menganalisis apakah ini bermanfaat.

Mundur dan coba lagi

Minta penelepon menyimpan permintaan yang gagal (mungkin tetap ke disk) dan coba lagi secara berkala. Penting dalam hal ini untuk membedakan antara permintaan Anda yang menyebabkan kerusakan vs layanan yang sedang macet. Yang pertama mungkin karena bug dan harus dicatat ... coba lagi mungkin tidak akan membuat perbedaan sampai perbaikan dilakukan.

Deteksi dan kompensasi

Tugas berkala memeriksa kondisi konsistensi antar layanan microser. Misalnya, kegagalan mencatat hingga permintaan API langsung. Jika menemukan masalah (mis. Ada pesanan tetapi pengiriman tidak pernah menerima daftar pengepakan) maka lakukan langkah-langkah kompensasi. Langkah-langkah itu bisa berupa membuat tiket dukungan untuk perbaikan manual, atau mengirim email kepada seseorang, atau apa pun.

Pertimbangkan alternatif desain

Kasus seperti ini mungkin membutuhkan gateway API untuk mengelola panggilan ke layanan microsoft yang terpengaruh. Dengan begitu Anda mengontrol taktik mana yang digunakan untuk mengurangi masalah ini. Anda mungkin tidak ingin membebani klien dengan detail implementasi tersebut. Lihat pola Pemutus Sirkuit .

Karena layanan mikro independen, akan selalu ada beberapa kasus kegagalan yang dapat mengakibatkan ketidakkonsistenan. Anda harus siap untuk melakukan perbaikan manual ketika itu muncul.

Jika Anda membutuhkan konsistensi yang kuat, maka layanan microser tidak akan cocok. Jika masih membutuhkan skalabilitas, Anda mungkin ingin melihat sharding di mana data terkait dapat ditempatkan di shard yang sama untuk jaminan konsistensi. Anda masih dapat meningkatkan IO dengan menambahkan pecahan.

Jika Anda membutuhkan konsistensi yang kuat dan tidak memiliki masalah skalabilitas, maka gunakan saja layanan monolitik. Gunakan perpustakaan sebagai batas dalam aplikasi Anda untuk memisahkan masalah.

Kasey Speakman
sumber
Apakah ini tujuan RabbitMQ?
johnny
Apakah RabbitMQ jawaban untuk pertanyaan Anda? Tidak. Itu bisa menjadi bagian dari solusi yang memenuhi kebutuhan Anda, tetapi itu tidak akan menyelesaikan masalah Anda sendirian.
Kasey Speakman
Hanya sebuah catatan. Saya pikir RabbitMQ tidak bertahan pesan. Ini dikonsumsi dan dihapus dari antrian, jadi TIDAK. Jika Anda membutuhkan kegigihan dan coba lagi, RabbitMQ tidak akan membantu.
Laiv
2

Saya pikir apa yang Anda gambarkan adalah masalah konsensus: Anda tidak ingin berkomitmen kecuali setiap peserta dalam transaksi terdistribusi mengatakan operasi itu berhasil. Solusi sederhana untuk ini adalah Two Phase Commit. Pada dasarnya itu tahap transaksi di setiap sistem sampai masing-masing melaporkan kembali bahwa pementasan berhasil (Tahap 1). Jika setiap peserta dalam transaksi mengembalikan kesuksesan, masing-masing diminta untuk berkomitmen; jika ada di antara mereka yang gagal, kemunduran dikeluarkan (Fase 2). Ada kerutan pada hal ini yang mengarahkan Anda ke solusi Tiga Fase Komit yang lebih kompleks. Anda dapat membaca deskripsi masing-masing di sini:

http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/

http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

iarejenius
sumber