rabbitmq可靠性投遞_阿里Java研發二面:了解RabbitMQ?說說RabbitMQ可靠性投遞

上期寫到高并發下RabbitMq消息中間件你應該介么玩今天給小伙伴說說!有自己看法的也可以在評論區留言探討,也可以轉發關注下我以后會長期分享!

目錄:確保消息發送到RabbitMQ服務器

確保消息被正確的路由

確保消息在隊列正確地存儲

確保消息從隊列正確地投遞到消費者

消費者回調

補償機制

消息冪等性

消息的順序性

可靠性投遞

首先需要明確,效率和可靠性是無法兼得的,如果要保證每一個環節都成功,勢必會對消息的收發效率造成影響,如過是一些業務實時性要求不是特別高的場合,可以犧牲可靠性來換取效率。

①代表消息從生產者發送到Exchange

②代表消息從Exchange路由到Queue

③ 代表消息在Queue中存儲;

④ 代表消費者訂閱Queue并消費消息。

1.確保消息發送到RabbitMQ服務器

可能因為網絡或者Broker的問題導致①失敗,而生產者是無法得知消息是否正確發送到Broker的。

有兩種解決方案:

第一種是Transaction事務模式

第二種是Confirm確認模式1.在通過channel.txSelect方法開啟事務之后,我們便可以發布消息給RabbitMQ了,如果事務提交成功,則消息一定 到達了RabbitMQ中,如果在事務提交執行之前由于RabbitMQ異常崩潰或者其他原因拋出異常,這個時候我們便可以將其捕獲,進而通過執行channel.txRollback方法來實現事務回滾。使用事務機制的話會“吸干”RabbitMQ的性 能,一般不建議使用。

2.生產者通過調用channel.con?rmSelect方法(即Con?rm.Select命令)將信道設置為con?rm模式。一旦消息被投遞到所有匹配的隊列之后,RabbitMQ就會發送一個確認(Basic.Ack)給生產者(包含消息的唯一ID),這就使得生產者知曉消息已經正確到達了目的地了。

2.確保消息被正確的路由

可能因為路由關鍵字錯誤,或者隊列不存在,或者隊列名稱錯誤導致②失敗。使用mandatory參數和ReturnListener,可以實現消息無法路由的時候返回給生產者。

另一種方式就是使用備份交換機(alternate-exchange),無法路由的消息會發送到這個交換機上。

Map arguments = new HashMap();

// 指定交換機的備份交換機

arguments.put("alternate-exchange","ALTERNATE_EXCHANGE");

channel.exchangeDeclare("TEST_EXCHANGE","topic", false, false, false, arguments);

3.確保消息在隊列正確地存儲

可能因為系統宕機、重啟、關閉等等情況導致存儲在隊列的消息丟失,即③出現問題。

解決方案:

1.隊列持久化

// String queue, boolean durable, boolean exclusive, boolean autoDelete, Map arguments

channel.queueDeclare(QUEUE_NAME, true, false, false, null);

2.交換機持久化

// String exchange, boolean durable

channel.exchangeDeclare("MY_EXCHANGE","true");

3.消息持久化

AMQP.BasicProperties properties = new AMQP.BasicProperties

.Builder()

// 2代表持久化,其他代表瞬態

.deliveryMode(2)

.build();

channel.basicPublish("", QUEUE_NAME, properties, msg.getBytes());

4.確保消息從隊列正確地投遞到消費者

如果消費者收到消息后未來得及處理即發生異常,或者處理過程中發生異常,會導致④失敗。

為了保證消息從隊列可靠性到達消費者,RabbitMQ提供了消息確認機制(message acknowledgement),消費者在訂閱隊列時,可以指定autoAck參數,當autoAck等于false時,RabbitMQ會等待消費者顯示地回復確認消息才從隊列中刪除該消息。

如果消息消費失敗,也可以調用Basic.Reject或者BasicNack來拒絕當前消息而不是確認,如果requere參數為true,可以把這條消息重新存入隊列,以便發送給下一個消費者。

5.消費者回調

消費者處理消息之后,可以再發送一條消息給生產者,或者調用生產者地API,告知消息處理完畢。

6.補償機制

對于一定時間沒有響應地消息,可以設置一個定時重發地機制,但是要控制次數,比如最多重復三次,否則會造成消息堆積。

7.消息冪等性

服務端是沒有這種控制的,只能在消費端控制。

如何避免消息的重復消費?消息重復消費可能會有兩個原因:生產者的問題。環節①重復發送消息,比如在開啟Confirm模式但未收到確認

環節④出了問題,由于消費者未發送ACK或者其它原因,消息重復投遞

對于重復發送的消息,可以對每一條消息生成一個唯一的業務id,通過日志或者建表來做重復控制。

8.消息的順序性

消息的順序性是指消費者消費消息的順序跟生產者投遞消息的順序是一致的。

在RabbitMQ中,一個隊列有多個消費者時,由于不同的消費者消費消息的速度是不一樣的,順序無法保證

學習分享對于高并發下RabbitMq消息中間件的使用,這位大咖也有講解的視頻,在這免費分享給大家,有需要的朋友可以幫忙點個贊關注下吧,分享不易,然后關注我的專欄(Java快速進階通道)看頂部提示,或直接(點我)領取哦!

視頻教學的內容包括:削峰限流、解耦作用

有限資源完成高并發購票

RabbitMq原理透析

購票完整閉環流程

單元測試與多線程高并發測試

不管多忙,每天給自己預留至少半小時的學習時間,拒絕做代碼垃圾的搬運工!

有不對的地方可以在評論區留言,覺得不錯的朋友希望能得到您的轉發支持,同時可以持續關注我,每周定期會分享3到4篇精選干貨!

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

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

相關文章

IBM發布Open Liberty 18.0.0.4,支持MicroProfile 2.1和反應性擴展框架

IBM在2018年第四季度發布的Open Liberty 18.0.0.4提供了對MicroProfile 2.1、反應性擴展框架和連接池指標的全面支持。根據發布說明:Open Liberty現在對JAX-RS 2.1進行了反應性擴展,這樣你就可以使用來自Apache CXF和Jersey的提供程序。在ops方面&#x…

b700a怎么連藍牙_233621藍牙2.1無線音箱B700A小測

隨著藍牙技術的發展,使用藍牙的相關產品也越來越多,各種藍牙耳機、藍牙鍵盤、藍牙鼠標都讓我們的外設擺脫了線材的束縛。小編之前也介紹過一款便攜藍牙音箱,也評測過一款藍牙耳機,而今天拿到的是一款采用藍牙2.1技術,造…

詳解:設計模式之-適配器模式

分享一波:程序員賺外快-必看的巔峰干貨 簡介 在設計模式中,適配器模式有時候也稱包裝樣式或者包裝。將一個類的接口轉接成用戶所期待的。一個適配使得因接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。 分類 …

excel 中編程:vba 入門

2019獨角獸企業重金招聘Python工程師標準>>> 1. 打開編程環境: altF11 打開開發環境 注意需要啟動宏,不然不能執行自定義的程序,保存后文件的后綴應該是:.xlsm 選擇一個 sheet 或一個模塊,右鍵查看代碼&…

android 快傳 源碼_最新安卓仿茄子快傳APP源碼包括服務端源碼Android開發快傳類項目源碼全套...

適使用范圍: 安卓APP茄子快傳源碼 Android項目源碼相似茄子快傳的快傳項目包括服務端運行環境: Android app源碼詳細:本項目是一個基于安卓的相似茄子快傳的項目源碼,包括安卓用戶端源碼,java的PC用戶端和PHP 的web網…

詳解:設計模式之-策略設計模式

分享一波:程序員賺外快-必看的巔峰干貨 什么是策略模式 定義一系列的算法,并將每一個算法單獨進行封裝,而且使它們可以相互替換,從而達到傳遞不同參數而執行不同算法的結果。 策略模式讓算法獨立于使用它的客戶而獨立變化 策略模式應用場…

mysql decode語句_MySQL復制問題的分析

s這是學習筆記的第 2031 篇文章最近有個業務的MySQL復制問題還是比較多,做了事務降維之后,把一些敏感操作和線上環境隔離起來,整體的效果好了許多,不過今天在外面的時候,又收到一條報警短信,讓我心里咯噔一…

jvm形象簡介之一看就懂

分享一波:程序員賺外快-必看的巔峰干貨 據 JVM 規范,JVM 內存結構共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。這里的java內存結構與前面所述的Java內存模型是兩個概念,不可以混淆。 堆 java堆是java虛擬機所管理的內存中最大的一塊…

MZOJ 1345 hero

一道寬搜模版題,可寫錯了兩個地方的我只得了56(掩面痛哭) http://10.37.2.111/problem.php?id1345 先看看正確的 #include <bits/stdc.h> #define read read() #define up(i,l,r) for(int i l; i<r; i) using namespace std;int read {int x 0; char ch getchar()…

opencv拖動進度條_OpenCV GUI基本操作,回調函數,進度條,裁剪圖像等-阿里云開發者社區...

代碼為轉載&#xff0c;出處找不到了&#xff0c;不貼了工具條進度條&#xff1a;// ConvertColor.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include #include #include #pragma comment(lib,"opencv_core2410d.lib")#pragma comment(lib…

區間DP初探 P1880 [NOI1995]石子合并

https://www.luogu.org/problemnew/show/P1880 區間dp,顧名思義,是以區間為階段的一種線性dp的拓展 狀態常定義為$f[i][j]$,表示區間[i,j]的某種解; 通常先枚舉區間長度,再枚舉左端點,最后枚舉斷點(k) 石子合并便是一道經典的區間dp #include <bits/stdc.h> #define read…

jvm詳解 - 新生代與老年代

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 Java 中的堆是 JVM 所管理的最大的一塊內存空間&#xff0c;主要用于存放各種類的實例對象。 在 Java 中&#xff0c;堆被劃分成兩個不同的區…

pymysql建表_Python數據庫操作,針對pymysql 和 MYSQL數據庫

此文將以MYSQL數據庫做為例子,pymysql庫作為驅動進行學習安裝MYSQL數據庫與pymysql第三方庫安裝pymysql庫不多做敘述安裝navicat for mysql,此程序用來管理MYSQL數據庫注意: 連接過程中可能會出現1251錯誤解決辦法,在cmd命令下登錄mysql后輸入:ALTER USER rootlocalhost IDENTI…

從0到1使用VUE-CLI3開發實戰(五):模塊化VUEX及使用vuetify

小肆前幾天發了一篇2019年Vue精品開源項目庫的匯總&#xff0c;今天小肆要使用的是在UI組件中排行第三的Vuetify。vuetify介紹 Vuetify是一個漸進式的框架&#xff0c;完全根據Material Design規范開發&#xff0c;一共擁有80多個組件&#xff0c;對移動端支持非常好。 支持SSR…

詳解垃圾回收算法

分享一波:程序員賺外快-必看的巔峰干貨 標記清除算法 概念 該算法有兩個階段。 標記階段&#xff1a;找到所有可訪問的對象&#xff0c;做個標記。 清除階段&#xff1a;遍歷堆&#xff0c;把未被標記的對象回收 缺點&#xff1a;會產生碎片&#xff0c;不夠連貫 應用場景…

智能情緒分析技術_石化緣推薦:煉化企業智能機器人巡檢技術應用前景分析!...

本期內容由湖南天一奧星泵業有限公司冠名煉化企業智能機器人巡檢技術應用前景分析王國彤1,孫秉才2,儲勝利2,宋亞敏1(1.中國石油天然氣股份有限公司大連石化分公司&#xff0c;遼寧省大連市&#xff1b;2.中國石油集團安全環保技術研究院有限公司&#xff0c;北京市)摘要&#x…

CentOS 7編譯程序后的環境變量設置

今晚在 CentOS 7 上配置 Gitea&#xff0c;配置完成后在本地 clone 倉庫會提示 Failed to execute git command: exec: "git-upload-pack": executable file not found in $PATH&#xff0c;果斷用軟連接打法解決。隨后在 push 時又出現 Failed to execute git comma…

詳解:JVM內存調優參數

分享一波:程序員賺外快-必看的巔峰干貨 -Xms JVM啟動時申請的初始Heap值&#xff0c;默認為操作系統物理內存的1/64但小于1G。默認當空余堆內存大于70%時&#xff0c;JVM會減小heap的大小到-Xms指定的大小&#xff0c;可通過-XX:MaxHeapFreeRation來指定這個比列。Server端JV…

數組指針 sizeof 實現_C++數組指針!

學習C數組的時候&#xff0c;對數組的了解不是很深。也不知道&#xff0c;為什么聲明一個數組&#xff0c;int a[10]&#xff0c;為什么a就是數組的地址。你可以這樣理解&#xff0c;將a理解為指向數組頭的一個指針&#xff0c;這樣就好理解了。理解了之后確實好像豁然開朗的樣…

利用人工智能提升團隊包容性

在2018年11月舉行的Gartner應用技術與解決方案峰會上&#xff0c;高級主管分析師John Kostoulas認為&#xff0c;積極培養包容性文化的團隊和團隊領導者將超越他們的目標。Kostoulas引用了CEB-Gartner在2016年進行的一項領導力驗證調查&#xff0c;他指出&#xff0c;性別多元化…