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.
Jawaban:
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.
sumber
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/
sumber