Untuk memastikan keandalan interaksi dalam skenario guncangan jaringan atau ketidaknormalan server, Simple Message Queue (SMQ, sebelumnya MNS) klien menerapkan kebijakan keandalan yang mencakup baik produsen maupun konsumen.
Produsen: mekanisme percobaan ulang
Jenis-jenis pengecualian dan pemicu percobaan ulang
Jenis-jenis Pengecualian: Identifikasi dan kategorikan pengecualian klien (
MNS ClientException, seperti waktu habis jaringan atau kesalahan pembatasan laju) dan pengecualian server (ServerException). Bedakan antara kesalahan yang dapat dicoba ulang (misalnya, kode kesalahan 5xx atau guncangan jaringan) dan kesalahan yang tidak dapat dicoba ulang (misalnya, sumber daya tidak adaQueueNotExist).Percobaan Ulang Klien Sesuai Kebutuhan: Untuk mengirim ulang pesan sesuai kebutuhan, Anda dapat membuat logika percobaan ulang dalam kode bisnis berdasarkan persyaratan bisnis Anda.
Kebijakan backoff
Disarankan untuk mengimplementasikan kebijakan backoff eksponensial (misalnya, dimulai dari 1 detik, dibatasi hingga 60 detik) dikombinasikan dengan kebijakan jitter acak. Dengan cara ini, percobaan ulang tingkat kluster yang berlebihan dapat dihindari.
Konsumen: mekanisme percobaan ulang
Produsen: percobaan ulang otomatis
Dalam kasus konsumsi gagal (misalnya, pesan tidak diakui secara eksplisit atau waktu habis konsumsi), SMQ akan secara otomatis mengirim ulang pesan berdasarkan periode timeout visibilitas antrian saat klien menarik pesan baru.
Konsumen: desain idempotensi
Rancang logika bisnis agar bersifat idempoten secara alami (misalnya, deduplikasi melalui kunci unik basis data) atau verifikasi apakah pesan telah dikonsumsi berdasarkan pengenal pesan unik
MessageIddikombinasikan dengan status layanan.
Penanganan pengecualian
Saat menghadapi pengecualian dalam logika konsumsi pesan, jangan kirim pesan pengakuan (ACK). Sebagai gantinya, izinkan SMQ untuk mengirim ulang pesan sampai berhasil dikonsumsi, pada titik mana Anda dapat memanggil operasi
DeleteMessageuntuk menghapus pesan tersebut.
Referensi
Untuk contoh kode dalam Java, lihat Gunakan contoh kode untuk menerima pesan.