RabbitMQ:生產者可靠性(生產者重連、生產者確認)

目錄

  • 一、生產者重連
  • 二、生產者確認


一、生產者重連

當網絡不穩定的時候,利用重試機制可以有效提高消息發送的成功率。不過SpringAMQP提供的重試機制是阻塞式的重試,也就是說多次重試過程中,當前線程是被阻塞的,會影響業務性能。

如果對于業務性能有要求,建議禁用重試機制。如果一定要使用,請合理配置等待時長和重試次數,當然也可以考慮異步線程來執行發送消息的代碼。

spring:rabbitmq:connection-timeout: 200ms  # 設置連接超時時間template:retry:enabled: true  # 開啟超時重試機制initial-interval: 1000ms  # 失敗后的初始等待時間multiplier: 1  # 失敗后下次的等待時長倍數,下次等待時長=initial-interval * multipliermax-attempts: 3  # 最大重試次數

二、生產者確認

RabbitMQ有兩種確認機制:Publisher ConfirmPublisher Return。開啟確認機制后,在MQ成功收到消息后會返回確認消息給生產者,返回的結果有以下幾種情況:

  1. 消息投遞到了MQ,但是路由失敗。此時會通過Publisher Return返回路由異常原因,然后返回ACK,告知投遞成功。
  2. 臨時消息投遞給了MQ,并且入隊成功,返回ACK,告知投遞成功。
  3. 持久消息投遞到MQ,并且入隊成功,返回ACK,告知投遞成功。
  4. 其他情況都會返回NACK,告知投遞失敗

在這里插入圖片描述
在生產者服務YML文件中增加一下配置:

spring:rabbitmq:publisher-returns: true  # 開啟publisher-return機制publisher-confirm-type: correlated  # 設置機制類型:異步

publisher-confirm-type有三種模式可選:

  • none:關閉confirm機制。
  • simple:同步阻塞等待MQ的回執消息。
  • correlated:MQ異步回調方式返回回執消息

每個RabbitTemplate只能配置一個ReturnCallback,因此需要在項目啟動過程中配置:

package com.ming.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class CommonConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.error(String.format("ReturnsCallback:消息發送失敗,應答碼 %s,原因 %s,交換機 %s,路由鍵 %s,消息 %s ...", returnedMessage.getReplyCode(), returnedMessage.getReplyText(), returnedMessage.getExchange(), returnedMessage.getRoutingKey(), returnedMessage.getMessage()));}});}
}

發送消息,指定消息ID,消息ConfirmCallback,此回調每一次發送消息的時候都要指定:

@Test
public void confirmCallbackTest() throws InterruptedException {// 1. 創建cdCorrelationData cd = new CorrelationData();// 2. 增加ConfirmCallbackcd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {@Overridepublic void onFailure(Throwable throwable) {  // Spring消息回調失敗log.warn("ConfirmCallback:Spring消息回調失敗......", throwable);}@Overridepublic void onSuccess(CorrelationData.Confirm confirm) {  // 消息發送回調if (confirm.isAck()) {log.info("ConfirmCallback:RabbitMQ 消息發送成功,收到ACK......");}else {log.warn("ConfirmCallback:RabbitMQ 消息發送成功,收到NACK......", confirm.getReason());}}});// 3. 發送消息rabbitTemplate.convertAndSend("mt.topic", "china.weather", "黃色警報 ......", cd);  // 成功例子// rabbitTemplate.convertAndSend("mt.topic", "aaa", "黃色警報 ......", cd);  // 失敗例子Thread.sleep(2000);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919471.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919471.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919471.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習新浪潮】空天地數據融合技術在城市三維重建中的應用

空天地數據融合技術在城市三維重建中的應用已取得顯著進展,尤其在提升精度以滿足具身智能機器人仿真訓練需求方面,研究和產品均呈現多樣化發展。以下是關鍵研究進展、產品方案及精度要求的詳細分析: 一、研究進展與技術路徑 1. 多源數據融合的技術突破 時空基準統一:通過…

Selenium自動化測試入門:cookie處理

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快driver.get_cookies() # 獲得cookie 信息driver.get_cookies(name) # 獲得對應name的cookie信息add_cookie(cookie_dict) # 向cookie 添加會話信息delete_cookie(na…

快解析如何讓遠程訪問更安全?

一、勒索病毒攻擊服務器的途徑很多用戶服務器對外開放&#xff0c;實現外網訪問&#xff0c;擔心服務器被勒索病毒攻擊&#xff01;勒索病毒攻擊服務器的途徑之一是通過路由器開放的端口進行掃描攻擊&#xff0c;所以盡量不要在服務器的路由器和防火墻中開放端口二、快解析如何…

Linux下編譯ARPACK

本文記錄Linux下編譯ARPACK的流程。 零、環境 操作系統Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、依賴 1.1 安裝oneAPI 參見&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 二、編譯ARPACK …

芋道RBAC實現介紹

說明&#xff1a;之前寫過一篇博客&#xff0c;介紹如何搭建一個基于角色的權限驗證框架 搭建一個基于角色的權限驗證框架 本文介紹在非常受歡迎的開源框架——芋道中是如何實現 RBAC 的&#xff0c;芋道的部署參考下面這篇文章&#xff1a; 芋道微服務代碼部署 介紹 一般…

Docker部署Jellyfin,沒有公網IP如何使用內網穿透遠程訪問?

Jellyfin是一款完全開源、免費的媒體服務器&#xff0c;可幫助你快速搭建屬于自己的私人流媒體平臺&#xff1a;電影、劇集、音樂、照片統統收納&#xff0c;跨設備隨點隨播。本文將以最簡潔的步驟&#xff0c;演示如何在Docker容器中部署Jellyfin&#xff0c;并通過貝銳花生殼…

Podman:Mysql(使用卷)

下載鏡像hpphcomp:~$ podman pull docker.1ms.run/mysql:latest Trying to pull docker.1ms.run/mysql:latest... Getting image source signatures Copying blob c81e70a25040 done | Copying blob 31f7d8dc4024 done | Copying blob b9916866e45f done | Copying blob …

2025年滲透測試面試題總結-21(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 一、文件上傳繞過方式&#xff08;Top 5&#xff09; 二、文件包含高危函數&#xff08;PHP為例&#xff0…

像海綿一樣吸收技術書籍的高效學習方法

像海綿一樣吸收技術書籍的高效學習方法前言六步高效閱讀法步驟1&#xff1a;快速瀏覽章節步驟2&#xff1a;先讀章末測驗步驟3&#xff1a;只讀粗體字步驟4&#xff1a;只讀每段的首句和末句步驟5&#xff1a;通讀整章步驟6&#xff1a;復習與重復高效學習技術書籍的實用技巧1.…

Day60--圖論--94. 城市間貨物運輸 I(卡碼網),95. 城市間貨物運輸 II(卡碼網),96. 城市間貨物運輸 III(卡碼網)

Day60–圖論–94. 城市間貨物運輸 I&#xff08;卡碼網&#xff09;&#xff0c;95. 城市間貨物運輸 II&#xff08;卡碼網&#xff09;&#xff0c;96. 城市間貨物運輸 III&#xff08;卡碼網&#xff09; 今天是Bellman_ford專場。帶你從普通的Bellman_ford&#xff0c;到隊列…

Jenkins服務器SSH公鑰配置步驟

步驟1. 在Jenkins服務器上生成SSH密鑰在Jenkins服務器上執行以下命令&#xff1a;# 1. 生成SSH密鑰對 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""# 2. 設置正確的權限 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub# 3. 查看公鑰內…

數據鏈路層-網絡層-傳輸層

文章目錄深入淺出理解網絡核心&#xff1a;從交換機到TCP/UDP一、數據鏈路層&#xff1a;交換機的"地盤"1. 數據鏈路層的核心功能2. 以太網的發展歷程3. 以太網中的MAC地址4. 以太網幀格式&#xff1a;數據的"快遞包裝"5. 交換機的工作原理&#xff1a;高效…

專題:2025跨境電商市場布局、供應鏈與產業帶賦能報告 |附130+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43616 2025年&#xff0c;跨境圈的老板們集體焦慮&#xff1a;美國關稅飆到145%&#xff0c;亞馬遜封號潮卷土重來&#xff0c;而東南亞卻悄悄漲了246%&#xff01;這不是危言聳聽——66%的美國消費者說&#xff0c;海外貨漲10%就換本…

LINUX 818 shell:random;for for

問題 [rootweb ~]# a$(echo $[$RANDOM%10]) 您在 /var/spool/mail/root 中有郵件 [rootweb ~]# echo $a 3 [rootweb ~]# echo 139$a$a$a$a$a$a$a$a 13933333333 您在 /var/spool/mail/root 中有郵件 [rootweb ~]# echo 139 $a 139 3 [rootweb ~]# echo $a 3 [rootweb ~]# echo …

JavaScript 原型機制詳解:從概念到實戰(附個人學習方法)

原型是 JavaScript 實現繼承與代碼復用的核心機制,也是面試高頻考點。本文結合個人學習經驗、核心概念解析與實戰案例,幫你徹底搞懂原型、prototype、__proto__ 及相關知識點,同時分享高效的學習方法。 一、個人學習方法:高效掌握復雜知識點 復雜概念(如原型)的學習,關…

【人工智能】2025年AI代理失控危機:構建安全壁壘,守護智能未來

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! 在2025年,AI代理(AI Agents)已成為日常生活和企業運營的核心組成部分,它們能夠自主決策、執行任務并與環境互動。然而,隨著AI代理能力的指數級提升,其安全隱患也日益凸顯,包括數據泄露…

從噪聲到動作:Diffusion Policy 如何改變機器人學習?

從噪聲到動作&#xff1a;Diffusion Policy 如何改變機器人學習&#xff1f; 引言 在機器人手臂操作方面一直存在諸多挑戰。我們熟悉的工業場景中的組裝機械臂&#xff0c;往往依賴于寫死的程序指令進行控制&#xff0c;具有高度規范化與高精度的特點。而當機械臂需要在復雜、…

量子計算和超級計算機將徹底改變技術

我們生活在技術時代&#xff0c;但未來仍有無限可能。近年來&#xff0c;各大企業在量子計算領域持續邁出雖小卻關鍵的步伐 —— 這一技術注定將徹底改變我們所熟知的世界。以下精選的潛在應用場景&#xff0c;將對從交通出行到醫療健康的多個領域產生深遠影響。 在由 “1” 和…

Linux 中文顯示空白框(Java)

問題展示&#xff1a;解決方案本系統采用宋體&#xff0c;若是其它字體&#xff0c;可以類似排查Font rewardFirstFont new Font("SimSun", Font.BOLD, 20);linux系統字體-檢查查詢linux系統所有字體fc-list檢查是否有目標字體&#xff08;SimSun&#xff09;&#…

普通用戶使用docker命令

參考大佬 https://blog.51cto.com/u_16175448/12082279 詳細步驟及代碼 步驟 1&#xff1a;安裝 Docker 首先&#xff0c;你需要安裝 Docker。 步驟 2&#xff1a;創建 Docker 用戶組 Docker 默認以 root 用戶運行&#xff0c;為了普通用戶能夠使用 Docker&#xff0c;我們需要…