RabbitMQ之發送者(生產者)可靠性

文章目錄

  • 前言
  • 一、生產者重試機制
  • 二、生產者確認機制
    • 實現生產者確認
      • (1)定義ReturnCallback
      • (2)定義ConfirmCallback
  • 總結


前言

生產者重試機制、生產者確認機制。


一、生產者重試機制

  • 問題:生產者發送消息時,出現了網絡故障,導致與MQ的連接中斷。
  • 解決:SpringAMQP提供的消息發送時的重試機制。即:當RabbitTemplate與MQ連接超時后,多次重試。

實現:
需要配置application.yaml文件

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

我們利用命令停掉RabbitMQ服務:

docker stop mq

然后測試發送一條消息,會發現會每隔1秒重試1次,總共重試了3次。消息發送的超時重試機制配置成功了!

注意:
當網絡不穩定的時候,利用重試機制可以有效提高消息發送的成功率。不過SpringAMQP提供的重試機制是阻塞式的重試,也就是說多次重試等待的過程中,當前線程是被阻塞的。
如果對于業務性能有要求,建議禁用重試機制。如果一定要使用,請合理配置等待時長和重試次數,當然也可以考慮使用異步線程來執行發送消息的代碼。

二、生產者確認機制

  • 一般情況下,只要生產者與MQ之間的網路連接順暢,基本不會出現發送消息丟失的情況,因此大多數情況下我們無需考慮這種問題。
  • 不過,在少數情況下,也會出現消息發送到MQ之后丟失的現象,比如:
    • MQ內部處理消息的進程發生了異常
    • 生產者發送消息到達MQ后未找到Exchange
    • 生產者發送消息到達MQ的Exchange后,未找到合適的Queue,因此無法路由
  • 針對上述情況,RabbitMQ提供了生產者消息確認機制,包括Publisher Confirm和Publisher Return兩種。在開啟確認機制的情況下,當生產者發送消息給MQ后,MQ會根據消息處理的情況返回不同的回執。

總結如下:

  • 當消息投遞到MQ,但是路由失敗時,通過Publisher Return返回異常信息,同時返回ack的確認信息,代表投遞成功
  • 臨時消息投遞到了MQ,并且入隊成功,返回ACK,告知投遞成功
  • 持久消息投遞到了MQ,并且入隊完成持久化,返回ACK ,告知投遞成功
  • 其它情況都會返回NACK,告知投遞失敗
  • 其中ack和nack屬于Publisher Confirm機制,ack是投遞成功;nack是投遞失敗。而return則屬于Publisher Return機制。
    默認兩種機制都是關閉狀態,需要通過配置文件來開啟。

實現生產者確認

發送者的application.yaml配置:

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

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

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

一般我們推薦使用correlated,回調機制。

(1)定義ReturnCallback

每個RabbitTemplate只能配置一個ReturnCallback,因此我們可以在配置類中統一設置。我們在發送者定義一個配置類:

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 MqConfirmConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// 獲取RabbitTemplateRabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);// 設置ReturnCallback(回調)rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.debug("收到消息的return callback, exchange:{},key:{}, msg:{}, code:{},text:{}", returnedMessage.getExchange(),returnedMessage.getRoutingKey(),returnedMessage.getMessage(),returnedMessage.getReplyCode(),returnedMessage.getReplyText());}});}
}

(2)定義ConfirmCallback

由于每個消息發送時的處理邏輯不一定相同,因此ConfirmCallback需要在每次發消息時定義。具體來說,是在調用RabbitTemplate中的convertAndSend方法時,多傳遞一個參數:
在這里插入圖片描述

這里的CorrelationData中包含兩個核心的東西:

  • id:消息的唯一標示,MQ對不同的消息的回執以此做判斷,避免混淆
  • SettableListenableFuture:回執結果的Future對象

將來MQ的回執就會通過這個Future來返回,我們可以提前給CorrelationData中的Future添加回調函數來處理消息回執:
在這里插入圖片描述
發送消息的測試類(添加ConfirmCallback):

@Test
void testPublisherConfirm() {// 1.創建CorrelationDataCorrelationData cd = new CorrelationData();// 2.給Future添加ConfirmCallbackcd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {@Overridepublic void onFailure(Throwable ex) {// 2.1.Future發生異常時的處理邏輯,基本不會觸發log.error("send message fail", ex);}@Overridepublic void onSuccess(CorrelationData.Confirm result) {// 2.2.Future接收到回執的處理邏輯,參數中的result就是回執內容if(result.isAck()){ // result.isAck(),boolean類型,true代表ack回執,false 代表 nack回執log.debug("發送消息成功,收到 ack!");}else{ // result.getReason(),String類型,返回nack時的異常描述log.error("發送消息失敗,收到 nack, reason : {}", result.getReason());}}});// 3.發送消息   RoutingKey是錯誤的rabbitTemplate.convertAndSend("dragon.direct", "q", "hello", cd);
}

由于傳遞的RoutingKey是錯誤的,路由失敗后,觸發了return callback,同時也收到了ack。當我們修改為正確的RoutingKey以后,就不會觸發return callback了,只收到ack。而如果連交換機都是錯誤的,則只會收到nack。

注意:

開啟生產者確認比較消耗MQ性能,一般不建議開啟。而且大家思考一下觸發確認的幾種情況:

  • 路由失敗:一般是因為RoutingKey錯誤導致,往往是編程導致
  • 交換機名稱錯誤:同樣是編程錯誤導致
  • MQ內部故障:這種需要處理,但概率往往較低。因此只有對消息可靠性要求非常高的業務才需要開啟,而且僅僅需要開啟ConfirmCallback處理nack就可以了。

總結

以上就是全部講解。

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

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

相關文章

分布式事務總結

文章目錄 一、分布式事務基礎什么是事務&#xff1f;本地事物分布式事務分布式事務的場景 二、分布式事務解決方案全局事務可靠消息服務TCC 事務 三、Seata 分布式事務解決方案3.1 Seata-At模式3.2 秒殺項目集成 Seata啟動 Seata-Server項目集成seata配置AT模式代碼實現 3.3 Se…

openstack(2)

目錄 塊存儲服務 安裝并配置控制節點 安裝并配置一個存儲節點 驗證操作 封裝鏡像 上傳鏡像 塊存儲服務 安裝并配置控制節點 創建數據庫 [rootcontroller ~]# mysql -u root -pshg12345 MariaDB [(none)]> CREATE DATABASE cinder; MariaDB [(none)]> GRANT ALL PR…

1、Docker概述與安裝

相關資源網站&#xff1a; ● docker官網&#xff1a;http://www.docker.com ● Docker Hub倉庫官網: https://hub.docker.com/ 注意&#xff0c;如果只是想看Docker的安裝&#xff0c;可以直接往下拉跳轉到Docker架構與安裝章節下的Docker具體安裝步驟&#xff0c;一步步帶你安…

82基于matlab GUI的圖像處理

基于matlab GUI的圖像處理&#xff0c;功能包括圖像一般處理&#xff08;灰度圖像、二值圖&#xff09;&#xff1b;圖像幾何變換&#xff08;旋轉可輸入旋轉角度、平移、鏡像&#xff09;、圖像邊緣檢測&#xff08;拉普拉斯算子、sobel算子、wallis算子、roberts算子&#xf…

【Rust日報】2023-11-22 Floneum -- 基于 Rust 的一款用于 AI 工作流程的圖形編輯器

Floneum -- 基于 Rust 的一款用于 AI 工作流程的圖形編輯器 Floneum 是一款用于 AI 工作流程的圖形編輯器&#xff0c;專注于社區制作的插件、本地 AI 和安全性。 Floneum 有哪些特性&#xff1a; 可視化界面&#xff1a;您無需任何編程知識即可使用Floneum。可視化圖形編輯器可…

oled的使用 動態的變量 51

源碼均在IIC手寫程序中 外部中斷實現變量加一 #include "reg52.h" #include "main.h" #include <intrins.h> #include "OLED.h" #include "bmp.h" #include "Delay.h" sbit LED1 P1^0; sbit LED2 P1^1; sbit LED3…

【LeetCode每日一題】525. 連續數組

題目&#xff1a; 給定一個二進制數組 nums , 找到含有相同數量的 0 和 1 的最長連續子數組&#xff0c;并返回該子數組的長度。 媽的 連題目都沒有讀懂&#xff01;本來看成是找到兩個連續子數組&#xff0c;兩個連續子數組的 0 1 個數分別相同&#xff0c;我說怎么看著如此…

Python報錯:AttributeError(類屬性、實例屬性)

Python報錯&#xff1a;AttributeError&#xff08;類屬性、實例屬性&#xff09; Python報錯&#xff1a;AttributeError 這個錯誤就是說python找不到對應的對象的屬性&#xff0c;百度后才發現竟然是初始化類的時候函數名寫錯了 __init__應該有2條下劃線&#xff0c;如果只有…

構建未來:云計算 生成式 AI 誕生科技新局面

目錄 引言生成式 AI&#xff1a;開發者新伙伴云計算與生成式 AI 的無縫融合亞馬遜云與生成式 AI 結合的展望/總結我用亞馬遜云科技生成式 AI 產品打造了什么&#xff0c;解決了什么問題未來科技發展趨勢&#xff1a;開發者的機遇與挑戰結合實踐看未來結語開源項目 引言 2023年…

SpectralGPT: Spectral Foundation Model 論文翻譯1

遙感領域的通用大模型 2023.11.13在CVPR發表 原文地址&#xff1a;[2311.07113] SpectralGPT: Spectral Foundation Model (arxiv.org) 摘要 ? 基礎模型最近引起了人們的極大關注&#xff0c;因為它有可能以一種自我監督的方式徹底改變視覺表征學習領域。雖然大多數基礎模型…

VSCode 連接遠程服務器問題及解決辦法

端口號不一樣&#xff0c;需要在配置文件中添加Port Host 27.223.26.46HostName 27.223.*.*User userForwardAgent yesPort 14111輸入密碼后可以連接 在vscode界面&#xff0c;終端&#xff0c;生成公鑰&私鑰 ssh-keygen可以看到有id_rsa和id_rsa.pub兩個文件生成&#…

curl 命令的一些基本用法,

curl 是一個用于在命令行中進行網絡請求的工具。以下是一些 curl 命令的常見用法&#xff1a; 從 URL 下載文件并保存為本地文件&#xff1a; curl -O URL例如&#xff1a; curl -O https://example.com/file.zip這將會將 file.zip 下載到當前目錄。 將文件下載到指定位置&…

Nginx如何配置負載均衡

nginx的負載均衡有4種模式&#xff1a; 1)、輪詢&#xff08;默認&#xff09; 每個請求按時間順序逐一分配到不同的后端服務器&#xff0c;如果后端服務器down掉&#xff0c;能自動剔除。 2)、weight 指定輪詢幾率&#xff0c;weight和訪問比率成正比&#xff0c;用于后端服務…

C#,《小白學程序》第五課:隊列(Queue)其一,排隊的技術與算法

日常生活中常見的排隊&#xff0c;軟件怎么體現呢&#xff1f; 排隊的基本原則是&#xff1a;先到先得&#xff0c;先到先吃&#xff0c;先進先出 1 文本格式 /// <summary> /// 《小白學程序》第五課&#xff1a;隊列&#xff08;Queue&#xff09; /// 日常生活中常見…

antDesignPro a-table樣式二次封裝

antDesignPro是跟element-ui類似的一個樣式框架&#xff0c;其本身就是一個完整的后臺系統&#xff0c;風格樣式都很統一。我使用的是antd pro vue&#xff0c;版本是1.7.8。公司要求使用這個框架&#xff0c;但是UI又有自己的一套設計。這就導致我需要對部分組件進行一定的個性…

nodejs微信小程序+python+PHP-青云商場管理系統的設計與實現-安卓-計算機畢業設計

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

mysql 性能參數調優詳解

1 優化連接池 連接池運行機制 MySQL連接器中的連接池&#xff0c;用以提高數據庫密集型應用程序的性能和可擴展性&#xff0c;默認啟用。MySQL連接器負責管理連接池中的多個連接&#xff0c;自動創建、打開、關閉和破壞連接&#xff0c;多個連接的創建&#xff0c;可滿足多客戶…

C++算法 —— 貪心(4)

文章目錄 1、分發餅干2、最優除法3、跳躍游戲Ⅱ4、跳躍游戲Ⅰ5、加油站6、單調遞增的數字7、壞了的計算器 1、分發餅干 455. 分發餅干 其實看完這個題會發現&#xff0c;如果給定的兩個數組不排序的話會非常難受&#xff0c;所以無論怎樣&#xff0c;先排序。接下來需要比較兩…

項目管理套路:看這一篇絕對夠用??

寫論文必不可少的&#xff0c;就是創建代碼并進行實驗。好的項目管理可以讓實驗進行得更加順利。本篇博客以一次項目實踐為例&#xff0c;介紹項目管理的方法&#xff0c;以及可能遇到的問題&#xff0c;并提供一些可行的解決方案。 目錄 項目管理工具開始第一步版本管理十分關…

GB/T 32223-2015 建筑門窗五金件檢測

建筑門窗五金件包括操縱部件&#xff08;傳動機構用執手、旋轉執手、雙面執手、單點鎖閉器&#xff09;、承載部件&#xff08;合頁&#xff0c;鉸鏈、滑撐、滑輪&#xff09;、傳動啟閉部件&#xff08;傳動鎖閉器、多點鎖閉器、插銷&#xff09;、輔助部件&#xff08;撐擋、…