ActiveMq和RabbitMq區別及其解析

1.ActiveMq,傳統的消息隊列,使用Java語言編寫。基於JMS(Java Message Service),採用多線程併發,資源消耗比較大。支持P2P和發佈訂閱兩種模式。
2.RabbitMQ,基於AMQP協議實現,支持多種場景,社區活躍量大。高性能,高可用,支持海量數據。

兩者區別在於JMS和AMQP(此圖取自別處),

 JMS提供了兩種消息模型,peer-2-peer(點對點)以及publish-subscribe(發佈訂閱)模型。當採用點對點模型時,消息將發送到一個隊列,該隊列的消息只能被一個消費者消費。而採用發佈訂閱模型時,消息可以被多個消費者消費。在發佈訂閱模型中,生產者和消費者完全獨立,不需要感知對方的存在。

在AMQP中,消息路由(messagerouting)和JMS存在一些差別,在AMQP中增加了Exchange和binding的角色。producer將消息發送給Exchange,binding決定Exchange的消息應該發送到那個queue,而consumer直接從queue中消費消息。queue和exchange的bind有consumer來決定。(https://blog.csdn.net/hpttlook/article/details/23391967)

下圖爲Amq的消費情況 ,Amq本地搭建及其簡單,Rmq還沒有試過。

P2P消費

發送和消費代碼相似,就是把createconsumer改爲createProducer.

發佈模式

   publisher = (ActiveMQTopicPublisher) session.createPublisher(topic);
            publisher.setDeliveryMode(DeliveryMode.PERSISTENT)
 
訂閱模式
subscriber = (ActiveMQTopicSubscriber) session.createDurableSubscriber(topic, "*****");
            subscriber.setMessageListener(this);

下圖爲RMQ的消費情況

     RMQ和AMQ最大區別在於有 vhost 和exchange,routingkey這些區別。只有exchange 和routingkey相匹配,纔會進行收發消息,不僅僅是隊列名的匹配,

在rabbitmq中,exchange有4個類型:direct,topic,fanout,header。

Direct:將消息中的Routing key與該Exchange關聯的所有Binding中的Routing key進行比較,如果相等,則發送到該Binding對應的Queue中。

Topic:將消息中的Routing key與該Exchange關聯的所有Binding中的Routing key進行對比,如果匹配上了,則發送到該Binding對應的Queue中,*(星號):可以(只能)匹配一個單詞#(井號):可以匹配多個單詞(或者零個)

Fanout :直接將消息轉發到所有binding的對應queue中,這種exchange在路由轉發的時候,忽略Routing key

Headers :將消息中的headers與該Exchange相關聯的所有Binging中的參數進行匹配,如果匹配上了,則發送到該Binding對應的Queue中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章