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)

ActiveMq和RabbitMq区别及其解析_第1张图片

下图为Amq的消费情况 ,Amq本地搭建及其简单,Rmq还没有试过。

ActiveMq和RabbitMq区别及其解析_第2张图片

P2P消费

ActiveMq和RabbitMq区别及其解析_第3张图片

发送和消费代码相似,就是把createconsumer改为createProducer.

ActiveMq和RabbitMq区别及其解析_第4张图片

发布模式

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

下图为RMQ的消费情况

ActiveMq和RabbitMq区别及其解析_第5张图片

     RMQ和AMQ最大区别在于有 vhost 和exchange,routingkey这些区别。只有exchange 和routingkey相匹配,才会进行收发消息,不仅仅是队列名的匹配,

ActiveMq和RabbitMq区别及其解析_第6张图片

ActiveMq和RabbitMq区别及其解析_第7张图片

ActiveMq和RabbitMq区别及其解析_第8张图片

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

你可能感兴趣的:(ActiveMq和RabbitMq区别及其解析)