成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RabbitMQ是如何確定消息是否投遞到隊列中的

開發 前端
在使用RabbitMQ消息中間件時,因為消息的投遞是異步的,默認情況下,RabbitMQ會刪除那些無法路由的消息。為了能夠檢出消息是否順利投遞到隊列,我們需要相應的處理機制。今天就來驗證一下相關的驗證機制。

[[344036]]

1. 前言

在使用RabbitMQ消息中間件時,因為消息的投遞是異步的,默認情況下,RabbitMQ會刪除那些無法路由的消息。為了能夠檢出消息是否順利投遞到隊列,我們需要相應的處理機制。今天就來驗證一下相關的驗證機制。

2. 消息投遞失敗

那么哪些情況消息會投遞失敗呢?RabbitMQ消息會先到達指定的交換機,然后由交換機路由到對應的隊列。所以以下幾種情況會導致消息投遞失敗。

  • 投遞的交換機不可用。
  • 投遞的交換機可用,但是沒有匹配到隊列。

3. 投遞失敗的處理機制

對應上面的兩種情況,RabbitMQ提供了對應的解決方案。

ConfirmCallback

RabbitMQ提供了ConfirmCallback接口用于實現消息發送到RabbitMQ交換器后進行確認回調。

在Spring Boot中需要開啟:

  1. spring: 
  2.   rabbitmq: 
  3.   # 通常選擇 correlated 
  4.     publisher-confirm-type: 

通常有三種選擇:

  • NONE ,禁用發布確認模式,是默認值。
  • CORRELATED,發布消息時會攜帶一個CorrelationData,被ack/nack時CorrelationData會被返回進行對照處理,CorrelationData可以包含比較豐富的元信息進行回調邏輯的處理。
  • SIMPLE,當被ack/nack后會等待所有消息被發布,如果超時會觸發異常,甚至關閉連接通道。

這里我使用CORRELATED模式,聲明一個ConfirmCallback并設置到RabbitTemplate中

  1. rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> { 
  2.     // correlationData 可能為空 
  3.     if (ack) { 
  4.         log.debug("消息發送到exchange成功,id: {}", correlationData.getId()); 
  5.     } else { 
  6.         log.debug("消息發送到exchange失敗,原因: {}", cause); 
  7.     } 
  8. }); 

當消息投遞到一個不存在的交換機Exchange且ack=false時會輸出日志:

  1. - Publishing message [(Body:'"hello"' MessageProperties [headers={spring_listener_return_correlation=a088eb3f-a234-4e15-bb7a-3aa9a6f043e6, spring_returned_message_correlation=29975bc1-f363-4e3a-85ca-010d13888720, __TypeId__=java.lang.String}, contentType=application/json, contentEncoding=UTF-8, contentLength=7, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])] on exchange [DIRECT_EXCHANGE1], routingKey = [DIRECT_ROUTING_KEY2] 
  2.  
  3. - 消息發送到exchange失敗,原因: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'DIRECT_EXCHANGE1' in vhost 'my_vhost', class-id=60, method-id=40) 

這里實現的比較簡單你可以增加一些消息投遞到交換機失敗后的操作處理邏輯。

ReturnCallback

ReturnCallback接口用于實現消息已經成功發送到RabbitMQ交換機,但沒有匹配到隊列時的回調。

在Spring Boot中需要同時開啟:

  1. spring: 
  2.   rabbitmq: 
  3.     publisher-returnstrue 
  4.     template: 
  5.       mandatory: true 

RabbitTemplate中的mandatory設置值優先級要高一些。

我們聲明一個ReturnCallback并設置到RabbitTemplate中

  1. rabbitTemplate.setMandatory(true); 
  2. rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> { 
  3.     String correlationId = message.getMessageProperties() 
  4.             .getHeader(PublisherCallbackChannel.RETURNED_MESSAGE_CORRELATION_KEY); 
  5.     log.debug("消息:{} 發送失敗, 應答碼:{} 原因:{} 交換機: {}  路由鍵: {}", correlationId, 
  6.             replyCode, replyText, exchange, routingKey); 
  7. }); 

當消息成功投遞到交換機但是無法匹配到隊列時:

  1. - Publishing message [(Body:'"hello"' MessageProperties [headers={spring_listener_return_correlation=155648bd-fc3e-4c8b-a650-7b1ce720c7a6, spring_returned_message_correlation=7029ee49-357a-42fc-8532-dc41b4bb8e87, __TypeId__=java.lang.String}, contentType=application/json, contentEncoding=UTF-8, contentLength=7, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])] on exchange [DIRECT_EXCHANGE], routingKey = [DIRECT_ROUTING_KEY2] 
  2.  
  3. - 消息:7029ee49-357a-42fc-8532-dc41b4bb8e87 發送失敗, 應答碼:312 原因:NO_ROUTE 交換機: DIRECT_EXCHANGE  路由鍵: DIRECT_ROUTING_KEY2 
  4. - 消息發送到exchange成功,id: 7029ee49-357a-42fc-8532-dc41b4bb8e87 

從上面我們也可以看出ReturnCallback只處理投遞到隊列失敗的情況,并不像ConfirmCallback既能處理失敗的情況也能處理成功的情況。

4. 總結

 

消息投遞失敗的處理在使用RabbitMQ的使用中時非常必要的,能夠幫助我們追蹤消息的投遞情況,以及處理消息投遞異常或者成功后的邏輯處理,為消息丟失進行一些兜底或者記錄。但是請注意這個并不是發生在消費階段,是否成功消費并不是由這兩種回調來處理,我們有空再對消息的消費確認進行講解。

本文轉載自微信公眾號「碼農小胖哥」,可以通過以下二維碼關注。轉載本文請聯系碼農小胖哥公眾號。

 

責任編輯:武曉燕 來源: 碼農小胖哥
相關推薦

2020-10-14 08:36:10

RabbitMQ消息

2022-07-26 20:00:35

場景RabbitMQMQ

2022-08-02 11:27:25

RabbitMQ消息路由

2023-03-06 08:16:04

SpringRabbitMQ

2024-05-10 09:36:36

架構消息隊列

2021-04-27 07:52:18

RocketMQ消息投遞

2024-08-12 12:17:03

2024-05-23 12:11:39

2024-04-15 00:00:00

RabbitMQ死信隊列消息

2023-09-05 15:48:14

RabbitMQ延遲隊列

2024-10-08 08:52:59

2021-03-11 06:01:41

Linux消息隊列

2023-09-06 14:11:03

數據庫Redis消息隊列

2019-05-29 14:49:02

KafkaRocketMQRabbitMQ

2023-11-20 09:33:43

開發指南

2024-05-16 08:10:17

RabbitMQ軟件通信機制

2023-08-17 10:20:18

RabbitMQ系統

2023-04-27 07:43:22

RabbitMQ重試隊列死信隊列

2023-06-01 08:54:08

RabbitMQ確認機制生產端

2023-10-23 10:02:58

RabbitMQ延遲隊列
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品有限公司 | 一区欧美| 中国av在线免费观看 | 国产综合精品一区二区三区 | 日韩在线中文 | 国产一区二区毛片 | 国产成人免费 | 欧美日韩综合一区 | 国产成人精品一区二区三区视频 | 一区二区三区在线免费观看视频 | 欧美理伦片在线播放 | 国产1区2区| av特级毛片| 美国a级毛片免费视频 | 日本一区二区三区四区 | 日本小视频网站 | 国产一区二区三区 | 伊伊综合网 | 欧美成人猛片aaaaaaa | 欧美一级二级在线观看 | 激情欧美一区二区三区中文字幕 | 国产精品一区久久久 | 日韩伦理一区二区 | 在线亚洲免费视频 | 美女久久久久久久久 | 亚洲视频一区二区三区 | 久久亚洲综合 | 99精品国产在热久久 | 中文字幕精品视频 | 国产精品不卡视频 | 欧美h| 毛片一级片| 久草视频在线播放 | 免费在线观看一区二区三区 | 国产综合久久 | 国产在线网址 | 在线观看黄免费 | 欧美视频三区 | 亚洲精品一区二区网址 | 欧美黄色精品 | 神马久久春色视频 |