4-2、ActiveMQ 轉 RabbitMQ 介紹
為什麼要選擇RabbitMQ?而不是ActvieMQ,優勢在哪裡?直接上圖來介紹:
direct
direct型別的Exchange路由規則也很簡單,它會把訊息路由到那些binding key與routing key完全匹配的Queue中。
以上圖的配置為例,我們以routingKey=”error”傳送訊息到Exchange,則訊息會路由到Queue1(amqp.gen-S9b…,這是由RabbitMQ自動生成的Queue名稱)和Queue2(amqp.gen-Agl…);如果我們以routingKey=”info”或routingKey=”warning”來發送訊息,則訊息只會路由到Queue2。如果我們以其他routingKey傳送訊息,則訊息不會路由到這兩個Queue中。
RPC
MQ本身是基於非同步的訊息處理,前面的示例中所有的生產者(P)將訊息傳送到RabbitMQ後不會知道消費者(C)處理成功或者失敗(甚至連有沒有消費者來處理這條訊息都不知道)。 但實際的應用場景中,我們很可能需要一些同步處理,需要同步等待服務端將我的訊息處理完成後再進行下一步處理。這相當於RPC(Remote Procedure Call,遠端過程呼叫)。在RabbitMQ中也支援RPC。
RabbitMQ 中實現RPC
的機制是:
- 客戶端傳送請求(訊息)時,在訊息的屬性(
MessageProperties
,在AMQP
properties
,這些屬性會隨著訊息一起傳送)中設定兩個值replyTo
(一個Queue
名稱,用於告訴伺服器處理完成後將通知我的訊息傳送到這個Queue
中)和correlationId
(此次請求的標識號,伺服器處理完成後需要將此屬性返還,客戶端將根據這個id瞭解哪條請求被成功執行了或執行失敗) - 伺服器端收到訊息並處理
- 伺服器端處理完訊息後,將生成一條應答訊息到
replyTo
指定的Queue
,同時帶上correlationId
屬性 - 客戶端之前已訂閱
replyTo
Queue
,從中收到伺服器的應答訊息後,根據其中的correlationId
屬性分析哪條請求被執行了,根據執行結果進行後續業務處理
總結
本文介紹了RabbitMQ
中個人認為最重要的概念,充分利用RabbitMQ
提供的這些功能就可以處理我們絕大部分的非同步業務了。
RabbitMQ 選型和對比
1.從社群活躍度
按照目前網路上的資料,RabbitMQ
、activeM
、ZeroMQ
三者中,綜合來看,RabbitMQ
是首選。
2.持久化訊息比較
ZeroMq
不支援,ActiveMq
和RabbitMq
都支援。持久化訊息主要是指我們機器在不可抗力因素等情況下掛掉了,訊息不會丟失的機制。
3.綜合技術實現
可靠性、靈活的路由、叢集、事務、高可用的佇列、訊息排序、問題追蹤、視覺化管理工具、外掛系統等等。
RabbitMq
/ Kafka
最好,ActiveMq
次之,ZeroMq
最差。當然ZeroMq
也可以做到,不過自己必須手動寫程式碼實現,程式碼量不小。尤其是可靠性中的:永續性、投遞確認、釋出者證實和高可用性。
4.高併發
毋庸置疑,RabbitMQ
最高,原因是它的實現語言是天生具備高併發高可用的erlang
語言。
5.比較關注的比較, RabbitMQ 和 Kafka
RabbitMq
比Kafka
成熟,在可用性上,穩定性上,可靠性上, RabbitMq 勝於 Kafka (理論上)。
另外,Kafka
的定位主要在日誌等方面, 因為Kafka
設計的初衷就是處理日誌的,可以看做是一個日誌(訊息)系統一個重要元件,針對性很強,所以 如果業務方面還是建議選擇 RabbitMq
。
還有就是,Kafka
的效能(吞吐量、TPS
)比RabbitMq
要高出來很多。
選型最後總結:
如果我們系統中已經有選擇 Kafka ,或者 RabbitMq ,並且完全可以滿足現在的業務,建議就不用重複去增加和造輪子。
可以在 Kafka 和 RabbitMq 中選擇一個適合自己團隊和業務的,這個才是最重要的。但是毋庸置疑現階段,綜合考慮沒有第三選擇。
上面廢話比較多,都是copy過來的,簡單的介紹一下幾個特徵:高可用、PRC、高併發、支援半腦裂問題。最主要的是它是spring boot 和spring cloud首選,官方推薦,3分鐘快速整合才是重點。廢話不多說,直接上配置:
1.application:
2.生產傳送者(一對多)
3.消費者
4.topic 主題傳送