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
中。