半年前新加入一家公司,發現公司所用的產品中引入了rabbitmq 這個消息中間件。引用rabbitmq 主要用來解決如下幾個問題:mysql
做爲業務開發人員,在平常的開發過程當中每每會將rabbitmq看作是一個黑盒,僅僅侷限於調用相關的API 進行消息的發送與消費操做,可是做爲一個合格的開發人員,咱們仍是有必要對於咱們用到的一些開源工具備必定的瞭解,相信每個開發人員心理都有一個技術夢,哈哈。好了,閒話很少說,讓咱們開始學習和了解rabbitmq 吧。redis
在瞭解rabbitmq 以前,我以爲有必要先了解一下消息中間件,那麼什麼是消息中間件呢?個人理解,消息中間件就是利用高效可靠的消息通訊機制,來實現異構系統的協同。它可以屏蔽不一樣平臺系統的語言以及一些特性的差別,實現系統的解耦。sql
消息中間件經常使用的場景有哪些呢?緩存
消息中間件通常傳遞消息有哪幾種模式呢?微信
P2P(點對點)模式 : 點對點模式通常是基於隊列的,生產者發送消息到隊列,消費者從隊列中接收消息。 這種用於一對一通訊,即一條消息只會被一個消費者消費。 異步
發佈訂閱(pub/sub)模式:消息生產者發佈消息到某個topic,消息消費者則從消息主題中訂閱消息,這種用於一對多廣播模式,即一條消息能夠被多個消費者消費。 工具
在瞭解rabbitmq以前,有必要對rabbitmq 涉及到的一些概念模型作個介紹:學習
AMQP(advance message queue protocal):高級隊列消息協議。Rabbitmq 是基於erlang 語言對於AMQP 協議的實現。spa
amqp協議詳細介紹:docs.oasis-open.org/amqp/core/v…3d
生產者: 就是發送投遞消息的一方.
消費者: 就是接收消費消息的一方.
broker:消息中間件的服務節點.
queue: rabbitmq的內部對象,用來存儲消息。
exchange:交換器
routingkey,bindingkey:指定消息的路由規則
vhost:虛擬主機
說明:我的理解exchange看作是消息的中轉中心,queue 看作是消息的存儲中心,具體這條消息中轉路由到哪一個queue,須要結合exchange的類型和routingkey ,以及bindingkey 來完成。而queue,exchange,和綁定關係針對每個vhost都是相對獨立的。
複製代碼
rabbitmq 的exchange 主要有幾種類型:fanout,direct,topic,header ,每一種分別表示不一樣的路由規則:
複製代碼
以下圖:com.rabbitmq.demo會匹配到queue1和queue2 ,com.hidden.client只會路由到queue2
在業務開發過程當中,面對rabbitmq這麼個黑盒子,咱們腦中經常會有一點疑惑?rabbitmq 能保證個人消息能正常的發送,正常的被消費而不丟失嗎?它是如何作到的呢?
rabbitmq 要作到這點,其實採用了不少手段和機制:
* 消息發送端:支持事務消息,發送者確認機制;---保證消息順利發送到broker消息。
* 持久化,鏡像隊列機制----保證消息能成功落盤,以及高可用性。
* 消息消費端:---消息者確認機制,等等。
一些具體的細節,在第2節中繼續分享個人學習心得。
複製代碼