消費者完成一個任務可能需要一段時間,如果其中一個消費者處理一個長的任務并僅隻完成了部分突然它挂掉了,會發生什麼情況? RabbitMQ 一旦向消費者傳遞了一條消息,便立即将該消息标記為删除。在這種情況下,突然有個消費者挂掉了,我們将丢失正在處理的消息。以及後續發送給該消費這的消息,因為它無法接收到。 為了保證消息在發送過程中不丢失,RabbitMQ 引入消息應答機制,消息應答就是:消費者在接收到消息并且處理該消息之後,告訴 RabbitMQ 它已經處理了,RabbitMQ 可以把該消息删除了。 RabbitMQ 的應答模式分為兩種:手動應答,自動應答
第二個參數代表是否要自動應答, true 代表自動應答, false 代表手動應答
消息發送後立即被認為已經傳送成功,這種模式需要在高吞吐量和資料傳輸安全性方面做權衡,因為這種模式如果消息在接收到之前,消費者那邊出現連接配接或者 channel 關閉,那麼消息就丢失了。 當然另一方面這種模式消費者那邊可以傳遞過載的消息,沒有對傳遞的消息數量進行限制,當然這樣有可能使得消費者這邊由于接收太多還來不及處理的消息,導緻這些消息的積壓,最終使得記憶體耗盡,最終這些消費者線程被作業系統殺死,是以這種模式僅适用在消費者可以高效并以某種速率能夠處理這些消息的情況下使用。
手動應答的好處是可以批量(multiple 參數控制)應答并且減少網絡擁堵
用于肯定确認,RabbitMQ 已知道該消息并且成功的處理消息,可以将其丢棄了
用于否定确認
用于否定确認,與 channel.basicReject() 的差別在于 basicNack() 可以拒絕多條消息,而 basicReject() 一次隻能拒絕一條消息