消息可靠性投遞
使用RabbitMQ的時候,作為消息發(fā)送方希望杜絕任何消息丟失或者投遞失敗場景,RabbitMQ為我們提供了兩種方式用來控制消息的投遞可靠性模式
RabbitMQ整個消息投遞的路徑為:
producer--->rabbitmq broker--->exchange--->queue--->consumer
確認(rèn)模式
設(shè)置ConnectionFactory的publisher-confirms="true" 開啟確認(rèn)模式
消息從producer到exchange則回返回一個confirmCallback
退回模式
設(shè)置ConnectionFactory的publisher-returns="true" 開啟退回模式
- 如果消息沒有路由到Queue,則丟棄消息(默認(rèn))
- 如果消息沒有路由到Queue,則會返回一個returnCallback,使用rabbitTemplate.setMandatory(true)參數(shù)開啟
- txSelect(),將當(dāng)前channel開啟事務(wù)
- txCommit(),用于提交事務(wù)
- txRollback(),用于回滾事務(wù)
事務(wù)機制
性能較差,不做講解
使用channel下列方法,完成事務(wù)控制:
Consumer ACK
ACK(acknowledge) 確認(rèn),表示消費端收到消息后的確認(rèn)方式
三種確認(rèn)方式:
- 自動確認(rèn):acknowledge="none" 當(dāng)消費者收到消息時會自動簽收,不管處理結(jié)果。
- 手動確認(rèn):acknowledge="manual" 消費端不會自動簽收,當(dāng)業(yè)務(wù)處理完成后,手動調(diào)用方法進行確認(rèn)。
- 根據(jù)異常情況確認(rèn):acknowledge="auto" 不常用
自動確認(rèn)是指,當(dāng)消息一旦被consumer接收到,則自動確認(rèn)收到,并將相應(yīng)message從RabbitMQ的消息緩存中移除,但是實際業(yè)務(wù)處理中,很可能消息接收到,但是業(yè)務(wù)處理出現(xiàn)異常,那么消息就會丟失。如果設(shè)置了手動確認(rèn)的方式,則需要在業(yè)務(wù)處理成功后,調(diào)用channel.basicAck(),手動簽收,如果出現(xiàn)異常,則調(diào)用channel.basicNack()方法,讓其自動重新發(fā)送消息。
消費端限流

image.png
配置監(jiān)聽容器為手動確定并且 prefetch = N,N 代表手動確認(rèn)完N條消息后再拉去另外N條消息。
TTL
TTL全稱為Time To Live (存活時間/過期時間)。
當(dāng)消息到達(dá)存活時間后,還沒有被消費,會被自動清除。
RabbitMQ可以對消息設(shè)置過期時間,也可以對整個隊列設(shè)置過期時間。
設(shè)置整個隊列的過期時間

image.png
設(shè)置單條消息的過期時間

image.png
消息發(fā)送時傳入對象

image.png
如果設(shè)置消息的過期時間同時也設(shè)置了隊列的過期時間,以短的為準(zhǔn)。
隊列過期后,會將隊列所有的消息全部移除
消息過期后,只有在隊列頂端的才會判斷是否過期進行移除(否則要對整個隊列進行輪詢判斷每條消息是否過期,效率低)
死信隊列

image.png

image.png

image.png

image.png

image.png
延遲隊列

image.png
消息可靠性分析與追蹤

image.png

image.png

image.png