RabbitMQ學習

一、RabbitMQ
采用 AMQP 高級消息隊列協議的一種消息隊列技術,最大的特點就是消費并不需要確保提供方存在,實現了服務之間的高度解耦
1、在分布式系統下具備異步,削峰,負載均衡等一系列高級功能;
2、擁有持久化的機制,進程消息,隊列中的信息也可以保存下來。
3、實現消費者和生產者之間的解耦。
4、對于高并發場景下,利用消息隊列可以使得同步訪問變為串行訪問達到一定量的限流,利于數據庫的操作。
5.可以使用消息隊列達到異步下單的效果,排隊中,后臺進行邏輯下單。
使用場景
1、服務間異步通信
2、順序消費
3、定時任務
4、請求削峰

二、確保消息正確地發送至 RabbitMQ和確保消息接收方消費了消息
發送方確認模式
將信道設置成 confirm 模式(發送方確認模式),則所有在信道上發布的消息都會被指派一個唯一的 ID。一旦消息被投遞到目的隊列后,或者消息被寫入磁盤后(可持久化的消息),信道會發送一個確認給生產者(包含消息唯一 ID)。如果 RabbitMQ 發生內部錯誤從而導致消息丟失,會發送一條 nack(notacknowledged,未確認)消息。發送方確認模式是異步的,生產者應用程序在等待確認的同時,可以繼續發送消息。當確認消息到達生產者應用程序,生產者應用程序的回調方法就會被觸發來處理確認消息。
接收方確認機制
接收方消息確認機制
消費者接收每一條消息后都必須進行確認(消息接收和消息確認是兩個不同操作)。只有消費者確認了消息,RabbitMQ 才能安全地把消息從隊列中刪除。這里并沒有用到超時機制,RabbitMQ 僅通過 Consumer 的連接中斷來確認是否需要重新發送消息。也就是說,只要連接不中斷,RabbitMQ 給了 Consumer 足夠長的時間來處理消息。保證數據的最終一致性;
如果消費者接收到消息,在確認之前斷開了連接或取消訂閱,RabbitMQ 會認為消息沒有被分發,然后重新分發給下一個訂閱的消費者。(可能存在消息重復消費的隱患,需要去重)如果消費者接收到消息卻沒有確認消息,連接也未斷開,則 RabbitMQ 認為該消費者繁忙,將不會給該消費者分發更多的消息。

三、避免消息重復投遞或重復消費
在消息生產時,MQ 內部針對每條生產者發送的消息生成一個 inner-msg-id,作為去重的依據(消息投遞失敗并重傳),避免重復的消息進入隊列;
在消息消費時,要求消息體中必須要有一個 bizId(對于同一業務全局唯一,如支付 ID、訂單 ID、帖子 ID 等)作為去重的依據,避免同一條消息被重復消費。

四、消息基于傳輸
由于 TCP 連接的創建和銷毀開銷較大,且并發數受系統資源限制,會造成性能瓶頸。RabbitMQ 使用信道的方式來傳輸數據。信道是建立在真實的 TCP 連接內的虛擬連接,且每條 TCP 連接上的信道數量沒有限制。

五、消息分發
若該隊列至少有一個消費者訂閱,消息將以循環(round-robin)的方式發送給消費者。每條消息只會分發給一個訂閱的消費者(前提是消費者能夠正常處理消息并進行確認)。通過路由可實現多消費的功能。

六、消息路由
消息提供方->路由->一至多個隊列
消息發布到交換器時,消息將擁有一個路由鍵(routing key),在消息創建時設定。
通過隊列路由鍵,可以把隊列綁定到交換器上。
消息到達交換器后,RabbitMQ 會將消息的路由鍵與隊列的路由鍵進行匹配(針對不同的交換器有不同的路由規則);
常用的交換器主要分為一下三種
fanout:如果交換器收到消息,將會廣播到所有綁定的隊列上
direct:如果路由鍵完全匹配,消息就被投遞到相應的隊列
topic:可以使來自不同源頭的消息能夠到達同一個隊列。 使用 topic 交換器時,可以使用通配符

七、確保消息不丟失
消息持久化,當然前提是隊列必須持久化
RabbitMQ 確保持久性消息能從服務器重啟中恢復的方式是,將它們寫入磁盤上的一個持久化日志文件,當發布一條持久性消息到持久交換器上時,Rabbit 會在消息提交到日志文件后才發送響應。
一旦消費者從持久隊列中消費了一條持久化消息,RabbitMQ 會在持久化日志中把這條消息標記為等待垃圾收集。如果持久化消息在被消費之前 RabbitMQ 重啟,那么 Rabbit 會自動重建交換器和隊列(以及綁定),并重新發布持久化日志文件中的消息到合適的隊列。

八、RabbitMQ 好處
1、服務間高度解耦
2、異步通信性能高
3、流量削峰

九、RabbitMQ 的集群
鏡像集群模式
你創建的 queue,無論元數據還是 queue 里的消息都會存在于多個實例上,然后每次你寫消息到 queue 的時候,都會自動把消息到多個實例的 queue 里進行消息同步。好處在于,你任何一個機器宕機了,沒事兒,別的機器都可以用。壞處在于,第一,這個性能開銷也太大了吧,消息同步所有機器,導致網絡帶寬壓力和消耗很重!第二,這么玩兒,就沒有擴展性可言了,如果某個 queue 負載很重,你加機器,新增的機器也包含了這個 queue 的所有數據,并沒有辦法線性擴展你的 queue

十、MQ的缺點
系統可用性降低
系統引入的外部依賴越多,越容易掛掉,本來你就是 A 系統調用 BCD 三個系統的接口就好了,人 ABCD 四個系統好好的,沒啥問題,你偏加個 MQ 進來,萬一MQ 掛了咋整?MQ 掛了,整套系統崩潰了,你不就完了么。
系統復雜性提高
硬生生加個 MQ 進來,你怎么保證消息沒有重復消費?怎么處理消息丟失的情況?怎么保證消息傳遞的順序性?頭大頭大,問題一大堆,痛苦不已
一致性問題
A 系統處理完了直接返回成功了,人都以為你這個請求就成功了;但是問題是,要是 BCD 三個系統那里,BD 兩個系統寫庫成功了,結果 C 系統寫庫失敗了,咋整?你這數據就不一致了。所以消息隊列實際是一種非常復雜的架構,你引入它有很多好處,但是也得針對它帶來的壞處做各種額外的技術方案和架構來規避掉,最好之后,你會發現,媽呀,系統復雜度提升了一個數量級,也許是復雜了 10 倍。但是關鍵時刻,用,還是得用的

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

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

相關文章

計算機網絡(三) | 數據鏈路層 PPP協議、廣播CSMA/CD協議、集線器、交換器、擴展and高速以太網

文章目錄 1 數據鏈路基本概念和問題1.1 基本概念1.2 基本問題(1)封裝成幀(2)透明傳輸(3)差錯控制 2.數據鏈路層協議2.1 點對點 PPP協議2.1.1 需要實現的2.1.2 PPP組成2.1.3 幀格式2.1.4 工作流程 2.2 廣播 …

內網穿透的應用-如何結合Cpolar內網穿透工具實現在IDEA中遠程訪問家里或者公司的數據庫

文章目錄 1. 本地連接測試2. Windows安裝Cpolar3. 配置Mysql公網地址4. IDEA遠程連接Mysql小結 5. 固定連接公網地址6. 固定地址連接測試 IDEA作為Java開發最主力的工具,在開發過程中需要經常用到數據庫,如Mysql數據庫,但是在IDEA中只能連接本…

配置BFD多跳檢測示例

BFD簡介 定義 雙向轉發檢測BFD(Bidirectional Forwarding Detection)是一種全網統一的檢測機制,用于快速檢測、監控網絡中鏈路或者IP路由的轉發連通狀況。 目的 為了減小設備故障對業務的影響,提高網絡的可靠性,網…

“==”和“equals”的區別

“”和“equals”的區別 Java中“”和“equals”的區別在于,它們比較的內容不同。""比較的是對象的引用是否相等,而equals比較的是對象的值是否相等。 具體來說,以下是兩個操作符之間的區別: “”比較的是對象的引用&…

【鏈表Linked List】力扣-117 填充每個節點的下一個右側節點指針II

目錄 問題描述 解題過程 官方題解 問題描述 給定一個二叉樹: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為 N…

C++中字符串詳解

在C語言中只能通過字符串數組來模擬字符串,沒有字符串類型。在C引入了string類來表示字符串類型。從而用它定義字符串。 在C語言中: char str[] "abc"; char str[] {a,b,c,\0}; char* str "abc"; //這三種形式是C語言…

因為高考考砸了,我學了計算機

2015年,是我高中的最后一年。 2023年,我已在計算機領域工作十多個年頭。 我出生在東部省份的一個不沿海小縣城,在那里度過了我高考前的17年。起點平平,沒有任何特長傍身,也可以說是毫無亮點;成績中等&#…

代碼隨想錄算法訓練營第四十五天 _ 動態規劃_ 70. 爬樓梯、322.零錢兌換、279.完全平方數、139.單詞拆分。

學習目標: 動態規劃五部曲: ① 確定dp[i]的含義 ② 求遞推公式 ③ dp數組如何初始化 ④ 確定遍歷順序 ⑤ 打印遞歸數組 ---- 調試 引用自代碼隨想錄! 60天訓練營打卡計劃! 學習內容: 70. 爬樓梯 動態規劃五步曲&…

中文語音標注工具FunASR(語音識別)

全稱 A Fundamental End-to-End Speech Recognition Toolkit(一個語音識別工具) 可能大家用過whisper(openAi),它【標注英語的確很完美】,【但中文會出現標注錯誤】或搞了個沒說的詞替換上去,所…

【Fiddler】IDEA配置Fiddler

由于遇上了個迷之請求,接口調用正常,OkHttpClient調用正常,RestTemplate調用失敗,所以想看看發送的報文是怎樣的,所以就下了個Fiddler 問題 下載安裝,以及如何安裝證書,網上太多相同文章了&…

APP備案,最新獲取安卓簽名文件中MD5等信息方法

1.通過簽名文件獲取SHA1和SHA256 直接通過cmd執行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore輸入后回車會提示輸入密碼庫口令,直接輸入Keystore密碼(輸入過程中終端上不會顯示,輸完回車就行) 2.獲取md5 由于…

redis集群(cluster)筆記

1. 定義: 由于數據量過大,單個Master復制集難以承擔,因此需要對多個復制集進行集群,形成水平擴展每個復制集只負責存儲整個數據集的一部分,這就是Redis的集群,其作用是提供在多個Redis節點間共享數據的程序…

IDEA啟動失敗報錯解決思路

IDEA啟動失敗報錯解決思路 背景:在IDEA里安裝插件失敗,重啟后直接進不去了,然后分析問題解決問題的過程記錄下來。方便下次遇到快速解決。也是一種解決問題的思路,分享出去。 啟動報錯信息 Internal error. Please refer to https…

加索引后 sql loader-951

加索引后 sql loader-951 現象解決過程最終解決 現象 之前使用sqlldr正常,加表索引后使用sqlldr時 報錯 SQL Loader-951 解決過程 百度,說可能是鎖表(或者表未提交) 查看沒有對應未commit數據,且沒有鎖表。查看對應…

【筆記 Python 01】基本數據類型、基本類型

文章目錄 類型是否可轉換基本類型匯總集合 set【創建】【添加元素】【刪除】【清空】【差集】【交集】【并集】【update 批量更新】【set → numpy】 元組 tuple ()【描述】【優點】【元組的創建】【元組的插入】【刪除元組】 字典 dict {}【創建空列表】【創建列表】【字典的獲…

ke14--10章-1數據庫JDBC介紹

注冊數據庫(兩種方式),獲取連接,通過Connection對象獲取Statement對象,使用Statement執行SQL語句。操作ResultSet結果集 ,回收數據庫資源. 需要語句: 1Class.forName("DriverName");2Connection conn DriverManager.getConnection(String url, String user, String…

抖音各加密參數說明和獲取(含代碼)

?X-Bogus:X-Bogus是一種防數據包偽造的一個參數, 又稱為x偽造,主要用于反爬蟲,這個是某節公司下面基礎服務,這個反爬蟲機制幾乎用在了它所有的產品中,不過,只要是能正常使用,這些東…

什么是Non EC

今天在填一個表單時,里面有個Non EC的選項,不解其意。原來是歐盟成員國國民的意思,因為歐盟法規各方面比較嚴厲,所以會單列出來,作為一個條件。 互聯網查詢結果如下: Non-EC是指非歐盟(EU&#…

PHP基礎 - 常量字符串

常量 在PHP中,常量是一個簡單值的標識符,定義后默認是全局變量,可以在整個運行的腳本的任何地方使用。常量由英文字母、下劃線和數字組成,但數字不能作為首字母出現。 PHP中定義常量的方式是使用define()函數,其語法如下: bool define( string $name, mixed $value [,…

使用人工智能優化常見業務流程

在現代商業環境中,人工智能(AI)正在改變企業的運營方式。將人工智能集成到業務流程中可以提高效率和準確性,從而節省大量時間和成本。 這使員工能夠專注于更具戰略性的任務。人工智能在商業中的應用范圍從自動化日常任務到提供高級分析,以做…