rabbitmq 實踐與學習心得分享(1)

zxhy發表於2019-04-13

一.寫在前面

半年前新加入一家公司,發現公司所用的產品中引入了rabbitmq 這個訊息中介軟體。引用rabbitmq 主要用來解決以下幾個問題:

  • 傳送訊息:作為傳送訊息的載體,比如傳送系統訊息,微信,簡訊,email等形式訊息。

rabbitmq 實踐與學習心得分享(1)

  • mysql 資料異構儲存:業務側為了支援全文索引,引入了elasticSearch中介軟體,每次針對業務資料的增,刪,改,都會傳送訊息到rabbitmq,然後由消費端將變更的數同步到到elasticSearch 中。

rabbitmq 實踐與學習心得分享(1)

  • 快取資料的更新:針對一些應用比較頻繁的資料,系統引入了redis作為快取儲存,在業務資料發生變更的時候,相應的變更需要同步到redis。
    rabbitmq 實踐與學習心得分享(1)
    .

作為業務開發人員,在日常的開發過程中往往會將rabbitmq看做是一個黑盒,僅僅侷限於呼叫相關的API 進行訊息的傳送與消費操作,但是作為一個合格的開發人員,我們還是有必要對於我們用到的一些開源工具有一定的瞭解,相信每一個開發人員心理都有一個技術夢,哈哈。好了,閒話不多說,讓我們開始學習和了解rabbitmq 吧。

二. 初識rabbitmq

在瞭解rabbitmq 之前,我覺得有必要先了解一下訊息中介軟體,那麼什麼是訊息中介軟體呢?我的理解,訊息中介軟體就是利用高效可靠的訊息通訊機制,來實現異構系統的協同。它能夠遮蔽不同平臺系統的語言以及一些特性的差異,實現系統的解耦。

訊息中介軟體常用的場景有哪些呢?

  • 訊息通訊 (如上面的第一種場景)
  • 非同步解耦(如上面的第2,3種場景)
  • 流量削峰

訊息中介軟體一般傳遞訊息有哪幾種模式呢?

  • P2P(點對點)模式 : 點對點模式一般是基於佇列的,生產者傳送訊息到佇列,消費者從佇列中接收訊息。 這種用於一對一通訊,即一條訊息只會被一個消費者消費。

    rabbitmq 實踐與學習心得分享(1)

  • 釋出訂閱(pub/sub)模式:訊息生產者釋出訊息到某個topic,訊息消費者則從訊息主題中訂閱訊息,這種用於一對多廣播模式,即一條訊息可以被多個消費者消費。

    rabbitmq 實踐與學習心得分享(1)

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:虛擬主機

rabbitmq 實踐與學習心得分享(1)

 說明:個人理解exchange看做是訊息的中轉中心,queue 看做是訊息的儲存中心,具體這條訊息中轉路由到哪個queue,需要結合exchange的型別和routingkey ,以及bindingkey 來完成。而queue,exchange,和繫結關係針對每一個vhost都是相對獨立的。
複製程式碼

2) rabbitmq exchange 的介紹:

rabbitmq 的exchange 主要有幾種型別:fanout,direct,topic,header ,每一種分別表示不同的路由規則:
複製程式碼
  • fanout:將訊息路由到與exchange 繫結的所有佇列中。和routingkey 無關:

rabbitmq 實踐與學習心得分享(1)

  • direct:將訊息路由到Bingdingkey 與routingkey 完全匹配的佇列中。

rabbitmq 實踐與學習心得分享(1)

  • topic :將訊息路由到Bingdingkey 與routingkey 匹配的佇列中,注意這裡的匹配支援模糊匹配。 routingkey和bindingkey 中含.的字串被拆分成一個個單詞:#用於匹配一個單詞,*用於匹配多個單詞。 如下圖:com.rabbitmq.demo會匹配到queue1和queue2 ,com.hidden.client只會路由到queue2

rabbitmq 實踐與學習心得分享(1)
header:基於訊息頭中的屬性進行匹配,一般不用這種。

三.後記 rabbitmq 如何保證訊息的可靠傳輸的呢?

在業務開發過程中,面對rabbitmq這麼個黑盒子,我們腦中常常會有一點疑惑?rabbitmq 能保證我的訊息能正常的傳送,正常的被消費而不丟失嗎?它是如何做到的呢?

  rabbitmq 要做到這點,其實採用了很多手段和機制:   
  * 訊息傳送端:支援事務訊息,傳送者確認機制;---保證訊息順利傳送到broker訊息。  
  * 持久化,映象佇列機制----保證訊息能成功落盤,以及高可用性。
  * 訊息消費端:---訊息者確認機制,等等。
  
  一些具體的細節,在第2節中繼續分享我的學習心得。
複製程式碼

相關文章