主頁 > 軟體設計 > 訊息佇列之-RabbitMQ

訊息佇列之-RabbitMQ

2021-02-02 14:21:57 軟體設計

歡迎關注 公眾號 dying 擱淺 有音頻版本

1. 什么是 MQ

1.1 概念

MQ 全拼 Message Queue 即 訊息佇列,是在訊息的傳輸程序中保存訊息的容器,多用于分布式系統,
在這里插入圖片描述
在這里插入圖片描述

1.2 MQ 帶來的優勢

MQ 所帶來的優勢即我們用 MQ 的理由,如下:

  1. 應用解耦:復雜系統增加訊息佇列中間層解耦兩端邏輯,提高系統容錯性和可維護性
  2. 異步處理:訊息異步處理,加快服務回應速度,提升用戶體驗和系統吞吐量
  3. 削峰填谷,流量控制:系統從訊息佇列中拉取消費請求,由訊息佇列緩沖量并發請求,請求量大可削峰,請求量小可填谷,提高系統穩定性

實際案例場景:

秒殺、聊天、等

1.3 MQ 帶來的問題

所謂 天下沒有免費的午餐,有利就有弊,引入 MQ 同樣也會給我們帶來不少問題:

  1. 增加了系統復雜度和維護成本,
  2. 引入訊息佇列所帶來的延遲問題,
  3. 可能存在的資料不一致問題,

利弊權衡間考慮你的系統是否需要引入訊息佇列,

2. RabbitMQ 簡介

公司/社區: Rabbit
開發語言:Erlang (為高并發和分布式誕生的語言,電信領域使用廣泛)
協議支持:AMQP、XMPP、SMTP、STOMP
客戶端支持語言:官方支持 Erlang、Java、Ruby 等,社區提供幾乎支持所有主流語言,
單機吞吐量: 萬級
訊息延遲: 微秒
功能特性:并發能力強,性能極好,低延遲,社區活躍,完善的管理界面,

下圖是一個簡單的模型,以及一些相關概念
在這里插入圖片描述

2.1 什么是 AMQP

AMQP 全稱 Advanced Message Queuing Protocol高級訊息佇列協議,是一個應用層網路協議,專門面向訊息佇列的中間件進行設計的協議,基于此協議的客戶端與訊息中間件可以傳遞訊息,不受不同 客戶端/中間件/開發語言等條件限制,是一個通信規范,

2.2 基礎架構模型

在這里插入圖片描述
名詞解釋:

Broker: 中間件,接收和分發訊息的應用,如 RabbitMQ Server 就是 Message Broker (訊息中間件)

Virtual host:虛擬主機,出于多租戶和安全的考慮,把 AMQP 的基本組件劃分到一個虛擬的分組中,類似于網路中 namespace 命名空間的概念,當多個用戶使用同一個 RabbitMQ server 所提供的服務時,可以劃分出多個 virtual host ,每個用戶在自己的 virtual host 進行 exchange 以及 queue 等,互不干擾,

Connection 鏈接,publisher 發布者 、consumer 訂閱者 與 broker 之間的 TCP 鏈接,

Channel:通道,管道, channel 是在 connection 內部建立的邏輯鏈接,為了避免程式多執行緒而創建多個 connection 做的優化, 如果應用程式支持多執行緒,通常每個 thread 會創建單獨的 channel 進行通訊, AMQP Method 包含了 channelId 幫助客戶端和 message broker 識別 channel ,每個 channel 相互隔離,這個概念有點類似 進行和執行緒的對應關系,正好一個行程對應一個 connection ,一個執行緒對應一個 channel 這樣的感覺,

Exchange:交換機,message 到達 broker 會先進過 交換機 ,根據分發規則,查表匹配 routing key ,將訊息分發到對應的 queue,常用的型別: direct (point-to-point),topic(publish-subscribe)、fanout (multicast)后文會詳細說明,

Queue:佇列,訊息最終存盤位置,等待 consumer 消費,

Binding: exchange 與 queue 之間的虛擬鏈接,binding 中可以包含 routing key,binding 資訊被保存到 exchange 的查詢表中,用于訊息的分發,

RabbitMQ 6 種作業模式

https://www.rabbitmq.com/getstarted.html

1. Hello World 模式

這個模式簡單理解就是 一對一的消費模式,一個生產者對應一個消費者,訊息僅消費一次,
在這里插入圖片描述

2. Work queues 作業佇列模式

作業佇列模式,與上面的簡單模式區別是 可以多個生產者,然后由多個消費者一起消費訊息,訊息僅消費一次,對應的可以提高訊息的處理速度,
在這里插入圖片描述

3. Publish/Subscribe 發布訂閱模式

到這里,發布訂閱模式,路由模式,主題模式 其實結構上大同小異,區別僅僅是 交換機 Exchange 的系結路由規則不同罷了,
同時在該模式下,一份訊息會分發給符合條件的多個佇列使用,且比上面的模式多了交換機的概念
交換機 顧名思義 作用就是將生產者生產的訊息,根據一定的規則分發到對應的佇列中,

發布訂閱模式的 Exchange 交換機是 Fanout 廣播模式,即:將訊息交給所有系結到交換機的佇列
在這里插入圖片描述

4. Routing 路由模式

路由模式的 Exchange 交換機是 Direct 定向模式,即:把訊息交給 routing key 路由對應的佇列
在這里插入圖片描述

5. Topics 主題模式

主題模式的 Exchange 交換機是 Topic 通配符模式,即:把訊息交給 routing pattern 路由匹配的佇列
在這里插入圖片描述

6. RPC 遠程呼叫模式

RPC 不是訊息佇列的重點,這里不做過多解釋,RPC 有更多成熟的框架實作,個人不建議使用訊息佇列來實作,
在這里插入圖片描述

訊息的可靠性

訊息生產端的可靠投遞

在使用 RabbitMQ 的時候,作為訊息發送方希望杜絕任何訊息丟失或者投遞失敗場景,RabbitMQ 為我們提供了兩種方式用來控制訊息的投遞可靠性模式,

confirm 確認模式
return 退回模式

rabbitmq 整個訊息投遞的路徑為:

producer—>rabbitmq broker—>exchange—>queue—>consumer

訊息從 producer 到 exchange 投遞失敗會回傳一個 confirmCallback ,
訊息從 exchange–>queue 投遞失敗會回傳一個 returnCallback ,

我們將利用這兩個 callback 控制訊息的可靠性投遞

注意這兩個模式需要進行配置開啟,如:

publisher-confirms=“true” 確認模式開啟
publisher-returns=“true” 回退模式開啟

消費端的確認消費 ACK

RabbitMQ 在消費端提供了 3 種確認機制

無需確認 acknowledge = "none" 該模式下無需手動撰寫代碼 ack ,RabbitMQ 默認 consumer 正確處理所有請求,

手動確認 acknowledge="manual" 該模式下需要手動撰寫代碼進行訊息確認 如正常收到訊息 channel.basicAck() 訊息例外 channel.basicNack() 等,

自動確認 acknowledge="auto" consumer 自動應答,處理成功(即沒有發生例外)發出 ack,處理失敗發出 nack,queue 發出訊息后會等待 consumer 端應答,只有收到 ack 確定資訊后才會將訊息在 queue 中清除掉,收到 nack 例外資訊的處理方法由setDefaultRequeueReject() 方法設定,這種模式下,發送錯誤的訊息可以恢復,

Java 代碼撰寫

關于 Java 代碼撰寫使用上,一般有 三種 方式

純 Java 代碼方式

Spring 配置方式

Spring Boot 自動配置方式

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/255670.html

標籤:其他

上一篇:SpringCloud之整體聚合父工程Project

下一篇:Soul網關原始碼閱讀(十四)—— Hystrix插件詳解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more