一.寫在前面
半年前新加入一家公司,發現公司所用的產品中引入了rabbitmq 這個訊息中介軟體。引用rabbitmq 主要用來解決以下幾個問題:
- 傳送訊息:作為傳送訊息的載體,比如傳送系統訊息,微信,簡訊,email等形式訊息。
- mysql 資料異構儲存:業務側為了支援全文索引,引入了elasticSearch中介軟體,每次針對業務資料的增,刪,改,都會傳送訊息到rabbitmq,然後由消費端將變更的數同步到到elasticSearch 中。
- 快取資料的更新:針對一些應用比較頻繁的資料,系統引入了redis作為快取儲存,在業務資料發生變更的時候,相應的變更需要同步到redis。 .
作為業務開發人員,在日常的開發過程中往往會將rabbitmq看做是一個黑盒,僅僅侷限於呼叫相關的API 進行訊息的傳送與消費操作,但是作為一個合格的開發人員,我們還是有必要對於我們用到的一些開源工具有一定的瞭解,相信每一個開發人員心理都有一個技術夢,哈哈。好了,閒話不多說,讓我們開始學習和了解rabbitmq 吧。
二. 初識rabbitmq
在瞭解rabbitmq 之前,我覺得有必要先了解一下訊息中介軟體,那麼什麼是訊息中介軟體呢?我的理解,訊息中介軟體就是利用高效可靠的訊息通訊機制,來實現異構系統的協同。它能夠遮蔽不同平臺系統的語言以及一些特性的差異,實現系統的解耦。
訊息中介軟體常用的場景有哪些呢?
- 訊息通訊 (如上面的第一種場景)
- 非同步解耦(如上面的第2,3種場景)
- 流量削峰
訊息中介軟體一般傳遞訊息有哪幾種模式呢?
-
P2P(點對點)模式 : 點對點模式一般是基於佇列的,生產者傳送訊息到佇列,消費者從佇列中接收訊息。 這種用於一對一通訊,即一條訊息只會被一個消費者消費。
-
釋出訂閱(pub/sub)模式:訊息生產者釋出訊息到某個topic,訊息消費者則從訊息主題中訂閱訊息,這種用於一對多廣播模式,即一條訊息可以被多個消費者消費。
1)rabbitmq 相關概念介紹
在瞭解rabbitmq之前,有必要對rabbitmq 涉及到的一些概念模型做個介紹:
-
AMQP(advance message queue protocal):高階佇列訊息協議。Rabbitmq 是基於erlang 語言對於AMQP 協議的實現。
amqp協議詳細介紹:docs.oasis-open.org/amqp/core/v…
-
生產者: 就是傳送投遞訊息的一方.
-
消費者: 就是接收消費訊息的一方.
-
broker:訊息中介軟體的服務節點.
-
queue: rabbitmq的內部物件,用來儲存訊息。
-
exchange:交換器
-
routingkey,bindingkey:指定訊息的路由規則
-
vhost:虛擬主機
說明:個人理解exchange看做是訊息的中轉中心,queue 看做是訊息的儲存中心,具體這條訊息中轉路由到哪個queue,需要結合exchange的型別和routingkey ,以及bindingkey 來完成。而queue,exchange,和繫結關係針對每一個vhost都是相對獨立的。
複製程式碼
2) rabbitmq exchange 的介紹:
rabbitmq 的exchange 主要有幾種型別:fanout,direct,topic,header ,每一種分別表示不同的路由規則:
複製程式碼
- fanout:將訊息路由到與exchange 繫結的所有佇列中。和routingkey 無關:
- direct:將訊息路由到Bingdingkey 與routingkey 完全匹配的佇列中。
- topic :將訊息路由到Bingdingkey 與routingkey 匹配的佇列中,注意這裡的匹配支援模糊匹配。
routingkey和bindingkey 中含.的字串被拆分成一個個單詞:#用於匹配一個單詞,*用於匹配多個單詞。
如下圖:com.rabbitmq.demo會匹配到queue1和queue2 ,com.hidden.client只會路由到queue2
三.後記 rabbitmq 如何保證訊息的可靠傳輸的呢?
在業務開發過程中,面對rabbitmq這麼個黑盒子,我們腦中常常會有一點疑惑?rabbitmq 能保證我的訊息能正常的傳送,正常的被消費而不丟失嗎?它是如何做到的呢?
rabbitmq 要做到這點,其實採用了很多手段和機制:
* 訊息傳送端:支援事務訊息,傳送者確認機制;---保證訊息順利傳送到broker訊息。
* 持久化,映象佇列機制----保證訊息能成功落盤,以及高可用性。
* 訊息消費端:---訊息者確認機制,等等。
一些具體的細節,在第2節中繼續分享我的學習心得。
複製程式碼