認識一下 RabbitMQ
分散式系統中,如何在各個應用之間高效的進行通訊,是系統設計中的一個關鍵。
使用 訊息代理(message broker) 是一個優雅的解決方案。
RabbitMQ 就是一個被廣泛應用的訊息代理,遵循 AMQP協議。
接下來我們就瞭解一下:
- Message Broker 概念
- AMQP 協議的核心構成
- 訊息轉發的 4 種模式
1. Message Broker
broker 是經紀人的意思,促成賣方、買方的交易,例如房產經紀人。
訊息模型中,有訊息的生產者、消費者,就相當於賣方、買方。
所以,也需要一個訊息經紀人,這就引出了 message broker 的概念。
message broker 從生產者接收訊息,再發送給消費者,這樣,生產者、消費者可以完全隔離。
RabbitMQ 就是一個 message broker。
2. AMQP
具體如何傳遞訊息?要看使用的訊息協議。
RabbitMQ 支援多種協議,其中最重要的是 AMQP(Advanced Message Queuing Protocol)。
AMQP 的概念模型很簡單,包含3個部分:
- Queue
- Binding
- Exchange
當一個訊息釋出到 RabbitMQ 後,首先到達 Exchange,然後 Exchange 把訊息分配給 Queue,消費者從 Queue 中得到訊息。
AMQP 是一個可程式設計的協議,我們可以自由配置 exchange, binding, queue。
2.1 Queue 佇列
Queue 是先進先出資料結構。
Queue 是 RabbitMQ 儲存訊息的地方。
Queue 可以靈活的配置,例如:
- 設定 name
- 配置可靠模式,即使 broker 宕機也可以保障資料安全
- 訊息自動刪除
- 獨佔模式
- ……
2.3 Consumer 消費者
一個 queue 可以同時連線多個 consumer。
consumer 既可以自己從 queue 拉取訊息,也可以由 queue 主動把訊息推給 consumer。
2.4 Binding 繫結
Binding 是 Queue 與 Exchange 建立連線的規則。
每個 Queue 都會與一個預設 Exchange 連線,我們可以為這個 Queue 連線更多的 Exchange。
Exchange 通過 Binding 規則,把訊息路由到相應的 Queue。
2.5 Exchange
Exchange 是 RabbitMQ 的訊息閘道器。
Exchange 就像是一個接線員,收到訊息後決定如何轉發。
主要有 4 種轉發型別:
- Direct
- Fanout
- Topic
- Header
下面具體瞭解一下。
3. 訊息轉發模式
3.1 Direct 直傳
Routing key == Binding key
routing key
是訊息的一個屬性。binding key
是繫結 queue 與 exchange 時指定的。
生產者(綠色球)傳送了一個訊息,帶著一個 routing key -- img.resize
。
當訊息到達 exchange(桔色球)後,exchange 會查詢所有帶著 img.resize
這個 Binding key 的 queue。
找到匹配的 queue 之後,訊息就會被髮送給這些 queue。
如果沒找到,訊息會被退回給生產者,或者丟棄。
訊息到達指定的 queue 之後,會以輪詢的形式分派給消費者(resizer.1/resizer.2),確保負載均衡。
3.2 Fanout 扇形
此方式會忽略 routing key
,把訊息分派給所有連線的 queue。
最常見的場景就是訊息廣播。
注意,此方式是 exchange 廣播給 queue,不是 queue 廣播給 consumer。queue 到 consumer 還是輪詢的方式。
3.3 Topic 主題
routing key
與 binding key
進行模式匹配。
Routing key == Pattern in binding key
RabbitMQ 使用 *
和 #
這2個萬用字元。
*
- 匹配一個詞。
#
- 匹配 0 個或多個詞。
routing key 為 logs.error
的訊息,匹配 binding key -- logs.error
和 logs.*
,所以訊息會進入 "only error" 和 "alllogs"。
routing key 為 logs.success
的訊息,匹配binding key -- #success
和 logs.*
,所以訊息會進入 "only success" 和 "alllogs"。
這種形式有非常多的應用場景,可以用於釋出-訂閱模式、將相關資料分發給期望的 worker 等等。
3.4 Header
一種特殊型別的 exchange,基於訊息頭中的 key 進行路由。
使用這種方式後,就會忽略訊息的 routing key 屬性。
對一個 header exchange 建立 binding 時,可以對一個 queue 繫結多個 header,這種情況下,訊息生產者需要告訴 RabbitMQ 匹配哪些 key,producer 可以指定一個標識 x-match
,值可以是:
- any - 只有一個值應該匹配。
- all - 所有值都必須匹配。
4. 訊息確認
訊息到達目的地之後,broker 應該從佇列中將其刪除,這是為了防止訊息過多導致溢位。
刪除訊息之前,broker 必須得到確認通知。
有 2 種通知方式:
- 自動通知:只要 consumer 接收到訊息即可,不管是否處理完成。
- 明確顯示通知:只有在 consumer 傳送回來一個確認資訊後才可以,這樣保證 consumer 處理完成後再刪除。
推薦閱讀:
- 架構設計原則 - 高併發
- 架構設計 -- 服務降級
- 介面級故障處理策略
- 高併發的常用策略
- 分散式唯一ID的生成方案
相關推薦
認識一下 RabbitMQ
分散式系統中,如何在各個應用之間高效的進行通訊,是系統設計中的一個關鍵。 使用 訊息代理(message broker) 是一個優雅的解決方案。 RabbitMQ 就是一個被廣泛應用的訊息代理,遵循 AMQP協議。 接下來我們就瞭解一下: Message Broker 概念 AMQP 協議的核心構成 訊息轉
詳細認識一下CSS盒子模型
css 盒子模型 定義CSS把每個元素看成是一個個單獨的框,這裏就叫它“元素框”吧。而CSS 盒子模型 (Box Model) 可以理解成一種規範,它規定了元素框處理其“最裏邊的內容區域(例如文本,圖像等)”、“內容周圍填充的區域”、“邊框” 和“邊界區域”的方式。PS: 為了方便區分概念,通常也會把
[DevOps] 認識一下
上線 lan 並不是 get 協作 時間 art evo 工具包 大家都在說DevOps(Develop Operation),大概知道就是開發和運維溝通交流,一條線,然後使產品能夠順利的、短時間內上線、維穩什麽的。 今天特意看了下 DockOne裏面的一篇文章,再鞏固下自
認識一下SKETCH
更新 retina 帶來 復雜 渲染 軟件 夢想 即使 每一個 Photoshop並不是一款合適的界面設計工具 為什麽我們會期待一個新的設計工具?因為當我們更多的關註效率和關註協作,就越發現Photoshop已經不足以滿足我們的期待了。下面看看具體的理由: 並非為設計師打造
還有人不認識通訊詐騙,短信驗證碼帶你認識一下
col 手機號 jpg 數據庫 平臺 獲取 gsm信號 第三方服務 關鍵技術 首先進行一下自我介紹,短信驗證碼本碼。短信驗證碼:網站或者客戶端應用需要接入短信驗證碼(手機驗證碼)的功能,可以實現註冊用戶的手機號碼正確性校驗,確保用戶填寫的手機號碼的真實性。現在已經完全融入了
認識一下JavaScript
1、什麼是JavaScript? JavaScript簡稱“JS”,應用於HTML和WEB,廣泛應用於伺服器、PC、筆記本等裝置。 2、js能做什麼? 簡言之處理網頁的動態事件,不知道能不能這樣理解, 3、js寫在哪裡? 可以放在<head>和<body&g
全球最小的微型 ZigBee無線模組,認識一下Micro XBee
不但完整支援ZigBee 3.0,還可以同時支援低功耗藍芽,只有人的指甲片大小,直線通訊距離卻可達好幾公里,原來不可想像的功能,在Digi的Micro XBee無線模組上可以全部找到。 XBee是全球出貨最多的無線模組品牌,在此之前,Digi公司的物聯網無線模組早已風扉世界十幾年,是人們
瞭解一下RabbitMQ
RabbitMQ概述 RabbitMQ是遵從AMQP協議的 通訊協議都設計到報文互動,換句話說RabbitMQ就是AMQP協議的Erlang的實現。 AMQP說到底還是一個通訊協議從low-level層面舉例來說,AMQP本身是應用層的協議,其填充於TCP協議的資料部分。 從high-level層面來說
來認識一下jQuery EasyUI
物理 化學 生物 歷史 地理 政治 英語 日語 法語 Java C# HTML </div> <!-- end --> <div data-options="re
認識一下java神器Btrace
轉載: http://calvin1978.blogcn.com/articles/btrace1.html BTrace是神器,每一個需要每天解決線上問題,但完全不用BTrace的Java工程師,都是可疑的。 BTrace的最大好處,是可以通過自己編寫的指令碼,獲取應用
認識一下身邊的網際網路---經典網際網路書籍閱讀總結
對於網際網路這張無處不在的“網路”,大家應該不會感到陌生。IDC評述網報道稱:截止到2014年底,全球接入網路的人數已達到29億(佔全球人口數的40%)。 這是一個網路互聯時代,這是一個網路經濟時代,網路帶來的微小而持續的變化改變了自工業時代以來的每一個人的行
Ruby on Rails,認識一下
Ruby on Rails 是一個可以使你開發、部署、維護 web 應用程式變得簡單的框架,這是百度百科上對於rails這個框架的介紹,它是使用 Ruby 程式語言開發的,自 2004 年出現之後,Rails 迅速成為動態 Web 應用開發領域功能最強大、最受歡迎的框架之一。 Rails 完
關於GCD執行緒順序的幾個題,認識一下
//測試第一個CGD的執行結果dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);NSLo
帶你認識一下“京東到家-網關係統”
京東到家三週年活動已然結束,在這2年裡,我們的網關係統經歷過了618,1020,雙11,雙12,415等多個非常有意義的考試,回顧起來依舊讓人覺得很刺激,每次考前我們和市場部都做了大量的效果預估、壓測&擴容,但是活動當日依舊是驚心動魄,瞬時數以10
Qt訊號量QSemaphore認識一下
QSemaphore也是一個執行緒同步工具,這個工具像是QMutex的升級版。對於QMutex而言,只要一個執行緒拿到QMutex的使用權,其他執行緒再想要拿就必須等著。QSemaphore的使用權(或稱資源)數量可以是多個,假如設定了QSemaphore的使用權有1
Telegram學習解析系列(一):認識一下Telegram的原始碼
前言: Telegram不知道有多少同行聽過這玩意,或者在看它的原始碼。我是出於工作原因才接觸到這東西,看的真是的......變方了!一個月估計剛剛找到門,還沒進去多深,把自己的心得和對原始碼的認識以及我工作中一些列的關於這個Telegram引發的問題全都寫出來,希望可以遇到同路中人,大
來認識一下venus-init——一個讓你僅需一個命令開始Java開發的命令列工具
原始碼地址: Github倉庫地址 個人網站:個人網站地址 前言 不知道你是否有過這樣的經歷。不管你是什麼崗位,前端也好,後端也罷,想去了解一下Java開發到底是什麼樣的,它是不是真的跟傳說中的一樣。 於是你拿起鍵盤,用觸控板 ? '' : 抄起滑鼠',開始了Java淌坑之旅。在一把梭的操作之後,面對你搭建的
Python基礎總結之第十天開始【認識一下python的另一個數據物件-----字典】(新手可相互督促)
看了大家的評論,還是有意外的收貨。感謝每個小夥伴的評論與補充。 眾人拾柴火焰高~ 今天的筆記是記錄python中的資料物件----字典! 前面有講到list列表和tuple元組的筆記,他們都是一
帶你漲姿勢的認識一下 Kafka
Kafka 基本概述 什麼是 Kafka Kafka 是一個分散式流式平臺,它有三個關鍵能力 訂閱釋出記錄流,它類似於企業中的訊息佇列 或 企業訊息傳遞系統 以容錯的方式儲存記錄流 實時記錄流 Kafka 的應用 作為訊息系統 作為儲存系統 作為流處理器 Kafka 可以建立流資料管道,可靠性的在系統
帶你漲姿勢的認識一下 Kafka 消費者
之前我們介紹過了 Kafka 整體架構,Kafka 生產者,Kafka 生產的訊息最終流向哪裡呢?當然是需要消費了,要不只產生一系列資料沒有任何作用啊,如果把 Kafka 比作餐廳的話,那麼生產者就是廚師的角色,消費者就是客人,只有廚師的話,那麼炒出來的菜沒有人吃也沒有意義,如果只有客人沒有廚師的話,誰會去這