RabbitMQ消息
生活随笔
收集整理的這篇文章主要介紹了
RabbitMQ消息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如何確保RabbitMQ消息的可靠性?
- 開啟生產者確認機制,確保生產者的消息能到達隊列
- 開啟持久化功能,確保消息未消費前在隊列中不會丟失
- 開啟消費者確認機制為auto,由spring確認消息處理成功后完成ack
- 開啟消費者失敗重試機制,并設置MessageRecoverer,多次重試失敗后將消息投遞到異常交換機,交由人工處理
1.生產者確認機制
- 對應配置:
- 啟動配置類
每個RabbitTemplate只能配置一個ReturnCallback,因此需要在項目啟動過程中配置
ApplicationContextAware ->bean工廠通知->拿到rabbitTemplate
@Slf4j @Configuration //生產者消息確認,確認信心到達隊列 public class CommonConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {//獲取RabbitTemplate對象RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);//配置ReturnCallbackrabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {//判斷是否是延遲消息if(message.getMessageProperties().getReceivedDelay()>0){return;}//失敗時才會回調//處理:記錄日志log.error("消息發送到隊列失敗,響應碼:{},失敗原因:{},交換機:{},路由key:{},消息:{}",replyCode,replyText,exchange,routingKey,message);//可以得到所有的錯誤信息,有需要的話,可以選擇重發信息});} }- 消息發送
2.消息持久化
- 交換機持久化
RabbitMQ中交換機默認是非持久化的,mq重啟后就丟失
默認情況下,由SpringAMQP聲明的交換機都是持久化的
- 隊列持久化
RabbitMQ中隊列默認是非持久化的,mq重啟后就丟失
默認情況下,由SpringAMQP聲明的隊列都是持久化的
- 消息持久化
利用SpringAMQP發送消息時,可以設置消息的屬性(MessageProperties),指定delivery-mode
默認情況下,SpringAMQP發出的任何消息都是持久化的,不用特意指定
3.1消費者確認機制
RabbitMQ是閱后即焚機制,RabbitMQ確認消息被消費者消費后會立刻刪除。
而RabbitMQ是通過消費者回執來確認消費者是否成功處理消息的:消費者獲取消息后,應該向RabbitMQ發送ACK回執,表明自己已經處理消息。
設想這樣的場景:
這樣,消息就丟失了。因此消費者返回ACK的時機非常重要。
而SpringAMQP則允許配置三種確認模式:
- manual:手動ack,需要在業務代碼結束后,調用api發送ack。
- auto:自動ack,由spring監測listener代碼是否出現異常,沒有異常則返回ack;拋出異常則返回nack
- none:關閉ack,MQ假定消費者獲取消息后會成功處理,因此消息投遞后立即被刪除
由此可知:
- none模式下,消息投遞是不可靠的,可能丟失
- auto模式類似事務機制,出現異常時返回nack,消息回滾到mq;沒有異常,返回ack
- manual:自己根據業務情況,判斷什么時候該ack
一般,我們都是使用默認的auto即可
3.2消費失敗重試機制
- 重試接收的交換機及隊列配置類
消費者兩種模式配置
logging:pattern:dateformat: HH:mm:ss:SSSlevel:cn.itcast: debug spring:rabbitmq:host: 192.168.23.130 # rabbitMQ的ip地址port: 5672 # 端口username: itcastpassword: 123321virtual-host: /listener:simple:prefetch: 1#acknowledge-mode: none # 關閉ack 消息處理拋異常時,消息依然被RabbitMQ刪除acknowledge-mode: auto # ack 自動返回結果retry:enabled: true # 開啟消費者失敗重試 在消費者本地重試,不會返回隊列initial-interval: 1000 # 初識的失敗等待時長為1秒multiplier: 1 # 失敗的等待時長倍數,下次等待時長 = multiplier * last-intervalmax-attempts: 3 # 最大重試次數stateless: true # true無狀態;false有狀態。如果業務中包含事務,這里改為false總結
以上是生活随笔為你收集整理的RabbitMQ消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机充电应该注意什么
- 下一篇: Flex布局 让你的布局更完美