Ketika konsumen menerima pesan dan tugas pemrosesan selesai, konsumen akan mengirimkan ack dengan pengidentifikasi pesan ini untuk memberi tahu server bahwa pesan telah diterima dan pemrosesan telah selesai. RabbitMQ menunggu hingga tautan konsumen yang memproses pesan hilang sebelum menentukan bahwa pesan tidak diproses dengan benar, sehingga RabbitMQ mengirimkan ulang pesan tersebut. Pengakuan pesan dinonaktifkan secara default. Ada parameter noAck saat menginisialisasi Konsumen,Jika diatur ke true, konsumen akan mengembalikan ack segera setelah menerima pesan。
Secara umum, skenario yang umum digunakan umumnya diatur ke benar, tetapi untuk proyek dengan persyaratan berisiko tinggi, seperti pembayaran. Untuk setiap pesan, kita perlu memastikan integritas dan kebenarannya. Setelah mendapatkan pesan, Anda perlu mengonfirmasi bahwa logika bisnis yang benar dijalankan, dan kemudian secara aktif mengembalikan ack ke server. Anda dapat melihat pesan dalam antrean melalui perintah rabbitmqctl list_queues name message_rady message_unacknowleded, atau melalui antarmuka manajemen latar belakang.
Jika noAck diatur ke false, klien perlu secara aktif mengirim ack ke server, dan jika klien tidak mengonfirmasi pesan, situasi berikut akan terjadi:
Selama program masih berjalan, 10 pesan ini tetap tidak terkendali dan tidak dapat disampaikan ulang oleh RabbitMQ. Yang lebih kuat adalah ituKonsumsi pesan RabbitMQ tidak memiliki mekanisme batas waktu, yaitu, jika program tidak dimulai ulang, pesan akan selalu dalam status Unacked. Jangan lupakan pesan status yang tidak diperiksa ini saat mengerjakan peristiwa operasi.
Siap
Pesan dengan status ini ada dalam antrean yang akan diproses.
Tidak diakui
Pesan dalam status ini menunjukkan bahwa pesan tersebut sudah diproses tetapi tidak diakui.
Saat program ditutup (selama Konsumen ditutup), 10 pesan ini akan kembali ke status Siap.
Pesan konfirmasi
Bagaimana jika klien mengirim ack ke server? Artinya, konfirmasi penerimaan pesan? Kodenya adalah sebagai berikut:
Ketika parameter kedua dari metode BasicAck, multiple, diatur ke false, itu berarti RabbitMQ diberi tahu bahwa pesan saat ini telah diakui.Jika true, pesan tambahan yang lebih kecil dari tag pengiriman yang ditentukan oleh parameter pertama akan diterima。 (Konfirmasi massal untuk seluruh saluran)
Batalkan konfirmasi
Bagaimana jika salah satu klien program terdistribusi memiliki pengecualian dan ingin membatalkan konfirmasi pesan dan membiarkan klien lain memproses pesan tersebut?
Ketika ada pengecualian dalam pesan konsumsi, kita perlu membatalkan konfirmasi, dan kemudian kita dapat menggunakan metode basicReject dari Channel.
Parameter pertama menentukan tag pengiriman, dan parameter kedua menjelaskan cara menangani pesan kegagalan ini.Nilai true berarti pesan dimasukkan kembali ke header antrean, dan nilai false berarti pesan ditinggalkan。
|