最全面透徹的RabbitMQ指南

概念

RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。RabbitMQ服務器是用Erlang語言編寫的,而集群和故障轉移是構建在開放電信平臺框架上的。所有主要的編程語言均有與代理接口通訊的客戶端庫。

RabbitMQ是一套開源(MPL)的消息隊列服務軟件,是由 LShift 提供的一個 Advanced Message Queuing Protocol (AMQP) 的開源實現,由以高性能、健壯以及可伸縮性出名的 Erlang 寫成。

4a17113f3a1b2b448bf6ab360f8db326.png

AMQP

AMQP 其實和Http一樣 都是一種協議, 只不過 Http是針對網絡傳輸的, 而AMQP是基于消息隊列的

AMQP 協議中的基本概念

**Broker: **

接收和分發消息的應用,我們在介紹消息中間件的時候所說的消息系統就是Message Broker。

**Virtual host: **

出于多租戶和安全因素設計的,把AMQP的基本組件劃分到一個虛擬的分組中,類似于網絡中的namespace概念。當多個不同的用戶使用同一個RabbitMQ server提供的服務時,可以劃分出多個vhost,每個用戶在自己的vhost創建exchange/queue等。

「Connection:」

publisher/consumer和broker之間的TCP連接。斷開連接的操作只會在client端進行,Broker不會斷開連接,除非出現網絡故障或broker服務出現問題。

**Channel: **

如果每一次訪問RabbitMQ都建立一個Connection,在消息量大的時候建立TCP Connection的開銷將是巨大的,效率也較低。Channel是在connection內部建立的邏輯連接,如果應用程序支持多線程,通常每個thread創建單獨的channel進行通訊,AMQP method包含了channel id幫助客戶端和message broker識別channel,所以channel之間是完全隔離的。Channel作為輕量級的Connection極大減少了操作系統建立TCP connection的開銷。

「Exchange:」

message到達broker的第一站,根據分發規則,匹配查詢表中的routing key,分發消息到queue中去。常用的類型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。

**Queue: **

消息最終被送到這里等待consumer取走。一個message可以被同時拷貝到多個queue中。

「Binding:」

exchange和queue之間的虛擬連接,binding中可以包含routing key。Binding信息被保存到exchange中的查詢表中,用于message的分發依據。

Exchange的類型

「direct :」

這種類型的交換機的路由規則是根據一個routingKey的標識,交換機通過一個routingKey與隊列綁定 ,在生產者生產消息的時候 指定一個routingKey 當綁定的隊列的routingKey 與生產者發送的一樣 那么交換機會吧這個消息發送給對應的隊列。

「fanout:」

這種類型的交換機路由規則很簡單,只要與他綁定了的隊列, 他就會吧消息發送給對應隊列(與routingKey沒關系)

「topic:」

(因為*在這個筆記軟件里面是關鍵字,所以下面就用星替換掉了)這種類型的交換機路由規則也是和routingKey有關 只不過 topic他可以根據:星,#( 星號代表過濾一單詞,#代表過濾后面所有單詞, 用.隔開)來識別routingKey 我打個比方 假設 我綁定的routingKey 有隊列A和B A的routingKey是:星.user B的routingKey是: #.user

那么我生產一條消息routingKey 為:error.user 那么此時 2個隊列都能接受到, 如果改為 topic.error.user 那么這時候 只有B能接受到了

「headers:」

這個類型的交換機很少用到,他的路由規則 與routingKey無關 而是通過判斷header參數來識別的, 基本上沒有應用場景,因為上面的三種類型已經能應付了。

執行過程

1.客戶端連接到消息隊列服務器,打開一個Channel。

2.客戶端聲明一個Exchange,并設置相關屬性。

3.客戶端聲明一個Queue,并設置相關屬性。

4.客戶端使用Routing key,在Exchange和Queue之間建立好綁定關系。

5.客戶端投遞消息到Exchange。

Exchange接收到消息后,就根據消息的key和已經設置的Binding,進行消息路由,將消息投遞到一個或多個隊列里。有三種類型的Exchanges:direct,fanout,topic,每個實現了不同的路由算法:

消息的ack機制

默認情況下,如果Message 已經被某個Consumer正確的接收到了,那么該Message就會被從queue中移除。當然也可以讓同一個Message發送到很多的Consumer。

如果一個queue沒被任何的Consumer Subscribe(訂閱),那么,如果這個queue有數據到達,那么這個數據會被cache,不會被丟棄。當有Consumer時,這個數據會被立即發送到這個Consumer,這個數據被Consumer正確收到時,這個數據就被從queue中刪除。

消息持久化

RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,為了數據安全考慮,大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:

1.Exchange持久化,在聲明時指定durable => 1

2.Queue持久化,在聲明時指定durable => 1

3.消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)

若Exchange和Queue都是持久化的,那么它們之間的Binding也是持久化的;而Exchange和Queue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。

特性

可伸縮性:集群服務

消息持久化:從內存持久化消息到硬盤,再從硬盤加載到內存

支持的操作系統

1、Linux

2、WindowsNT到10

3、VxWorks

4、macOS

5、FreeBSD

6、Windows Server2003到2016

7、Solaris

8、TRU64

支持的編程語言

1、Swift

2、Java

3、Elixir

4、Python

5、JavaScript

6、Objective-C

7、Go

8、Ruby

9、C#

7、Ruby

8、PHP

使用場景

  1. 解耦(為面向服務的架構(SOA)提供基本的最終一致性實現)

  2. 異步提升效率

  3. 流量削峰,流量削峰也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛

優缺點

在特殊場景下有其對應的好處,解耦、異步、削峰。

「缺點」

1、系統的可用性降低

系統引入的外部依賴越多,系統越容易掛掉。

2、系統的復雜性提高

引入了MQ之后,需要考慮的問題也變得多了,如何保證消息沒有重復消費?如何保證消息不丟失?怎么保證消息傳遞的順序?

3、一致性問題

A系統發送完消息直接返回成功,但是BCD系統之中若有系統寫庫失敗,則會產生數據不一致的問題。這就涉及到分布式事務的問題。

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

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

相關文章

TensorFlow中RNN實現的正確打開方式

上周寫的文章《完全圖解RNN、RNN變體、Seq2Seq、Attention機制》介紹了一下RNN的幾種結構,今天就來聊一聊如何在TensorFlow中實現這些結構,這篇文章的主要內容為: 一個完整的、循序漸進的學習TensorFlow中RNN實現的方法。這個學習路徑的曲線較…

【遙感物候】Hants NDVI時間序列諧波分析法數據重構,植被生長季曲線效果可佳(附Hants軟件下載)

NDVI時間序列諧波分析法(Harmonic Analysis of NDVI Time-Series)(簡稱Hants )對時間序列數據進行平滑。該方法是一種新的物候分析方法,可用于定量化的監測植被動態變化。其核心算法是傅里葉變換和最小二乘法擬合, 即把時間波譜數據分解成許多不同頻率的正弦曲線和余弦曲線,…

Android之在Java socket作為服務器里面返回數據頭部怎么寫入瀏覽器需要下載文件的文件名

1 問題 Android app里面寫了一個Java socket的簡單服務器,在瀏覽器里面輸入相應的IP和端口訪問服務器下載文件,Java socket怎么寫返回數據的頭部信息,瀏覽器才知道需要下載文件的名字呢? 2 關于Content-Disposition 在常規的HTTP應答中,Content-Disposition 響應頭指示回…

java中hasnext的作用_java中Scanner的hasNext()的疑問

第一個問題,兩段代碼的區別在于阻塞的位置不同,加上一行輸出代碼就可以很明顯地看到差別。Test.javaimport java.util.Scanner;public class Test {public static void main(String[] args) {Scanner s new Scanner(System.in);while(s.hasNext()){Syst…

《看聊天記錄都學不會C語言?太菜了吧》(2)我說編程很容易你們不服?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋…

ABAP的自學之路 ,初步認識ABAP 一

由于工作的關系,最近需要對SAP系統進行二次開發,于是開始學習ABAP。鑒于網上對于ABAP的資料少之又少,所以自己整理一些資料。 第一章 ABAP 開發環境和總體介紹1.1 ABAP 開發環境ABAP 開發的三種環境:(1)SAP…

LCD1602,4位數據總線液晶屏時鐘,STC12C5A60S2的10位ADC功能程序

/* 程序名:    LCD1602,4位數據總線液晶屏時鐘,STC12C5A60S2的10位ADC功能程序 編寫時間:  2015年10月4日 硬件支持:  LCD1602液晶屏 STC12C5A60S2 外部12MHZ晶振 接線定義: DB7 --> P1^7DB6…

WPF|黑暗模式的錢包支付儀表盤界面設計

收集下大家的意見,是否需要在文中貼上源碼(文末會給出源碼鏈接),請大家踴躍留言。閱讀目錄效果展示準備簡單說明 源碼結尾(視頻及源碼倉庫)1. 效果展示欣賞效果:2. 準備創建一個WPF工程&#x…

量子計算機的現狀和趨勢

量子計算機概述 計算機是一種新型的運算 它具有具有強大的并行處理數據的能力,可解決現有計算機難以運算的數學問題。因此,它成為世界各國戰略競爭的焦點。 量子計算機的優勢 量子計算機與現有的電子計算機以及正在研究的光計算機,生物計算機…

【空間數據庫】Windows操作系統PostgreSQL+PostGIS環境搭建圖文安裝教程

PostgreSQL是一種特性非常齊全的自由軟件的對象-關系型數據庫管理系統(ORDBMS),PostgreSQL支持大部分的SQL標準并且提供了很多其他現代特性,如復雜查詢、外鍵、觸發器、視圖、事務完整性、多版本并發控制等。同樣,PostgreSQL也可以用許多方法擴展,例如通過增加新的數據類…

Android之gravity=“center_vertical“和layout_gravity=“center“的效果

1、兩控件分別加上2個下面的屬性 gravity="center_vertical" android:layout_gravity="center" 代碼如下 <LinearLayoutandroid:id="@+id/ll_no_love"android:layout_width="match_parent"android:layout_height="match…

《看聊天記錄都學不會C語言?太菜了吧》(3)人艱不拆,代碼都在談戀愛?!

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

spark java 計數_spark程序——統計包含字符a或者b的行數

本篇分析一個spark例子程序。程序實現的功能是&#xff1a;分別統計包含字符a、b的行數。java源碼如下&#xff1a;package sparkTest;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;import…

golang reflect

reflect包實現了運行時反射&#xff0c;允許程序操作任意類型的對象。典型用法是用靜態類型interface{}保存一個值&#xff0c;通過調用TypeOf獲取其動態類型信息&#xff0c;該函數返回一個Type類型值。調用ValueOf函數返回一個Value類型值&#xff0c;該值代表運行時的數據。…

DB2常用命令

查看DB2License信息 DB2基礎命令 轉載于:https://www.cnblogs.com/arcer/p/5573317.html

.NET7 Preview4之MapGroup

這篇是“聞(看)香(碼)識(學)女(技)人(術)”。這也是一個有意思的功能&#xff0c;路由分組&#xff0c;啥也不說了&#xff0c;看代碼看結果&#xff1a;using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.OpenApi;var builder WebApplication.Create…

【空間數據庫】ArcGIS 10.6 Database_Server_Desktop安裝、連接數據庫服務、創建企業級數據庫(附server10.6.ecp)

由于作者一直使用SQL Server 2008 R2開發版,之前在ArcGIS中創建企業級數據庫都是基于單獨安裝的SQL Server 2008 R2開發版,今天我們演示安裝ArcGIS10.6自帶的數據庫服務(SQL Server 2014 Express版本)、連接數據庫服務和創建數據庫。 首先,我們來看一下完整的ArcGIS10.6安…

(一)easyUI之樹形網絡

樹形網格&#xff08;TreeGrid&#xff09;可以展示有限空間上帶有多列和復雜數據電子表 一、案例一&#xff1a;按tree的數據結構來生成 前臺<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DO…

《看聊天記錄都學不會C語言?太菜了吧》(4)零基礎的我原來早就學會編程了?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

Android之華為平板打日志提示Permission denied

1 問題 $ adb logcat | grep ssfsafaf int logctl_get(): open /dev/hwlog_switch fail -1, 13. Permission deniedNote: log switch off, only log_main and log_events will have logs!2 解決辦法 1&#xff09;、如果是華為手機&#xff0c;打開手機的撥號界面&#xff0c…