ActiveMq和RabbitMq区别及其解析

落羽成舟 2019-07-05

总括:

activemq与rabbitmq本质区别在于jms与amqp

activemq:  jms ---不夸平台 ----可用字节码传输,也可用json当做message的消息体

java写可以jar集成

crete  send  receive

只有failover功能,即我连一个失败了,可以切换到其他的broker上。这一点貌似不太科学

rabbitmq:amQp   ---跨平台----用字节码传输

erlang写

basicProduct

basicConsume

高性能,高可用,量数据,以插件的形式配合spring更灵活

集群可以多样化,可以queue分片式的集群,也可冗余性的集群

跨平台原因:

AMQP为消息定义了线路层(wire-level protocol)的协议,而JMS所定义的是API规范。JMS的API协议能够确保所有的实现都能通过通用的API来使用,但是并不能保证某个JMS实现所发送的消息能够被另外不同的JMS实现所使用。而AMQP的线路层协议规范了消息的格式,消息在生产者和消费者间传送的时候会遵循这个格式。这样AMQP在互相协作方面就要优于JMS——它不仅能跨不同的AMQP实现,还能跨语言和平台。

消息的提供者---exchanger---binding(rounting-key---queue)---客户端

提供者发送消息的时候会带入rounting-key就是队名,客户端直接订阅队列

exchanger中的rounting-key和bing中的key可以匹配到就把消息放入这个queue

vhost---相当于vip对应多个realip---可以使得一组应用用一组集群

具体:

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区别及其解析

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

ActiveMq和RabbitMq区别及其解析

P2P消费

ActiveMq和RabbitMq区别及其解析

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

ActiveMq和RabbitMq区别及其解析

发布模式

   publisher = (ActiveMQTopicPublisher) session.createPublisher(topic);

            publisher.setDeliveryMode(DeliveryMode.PERSISTENT)

订阅模式

subscriber = (ActiveMQTopicSubscriber) session.createDurableSubscriber(topic, "*****");

            subscriber.setMessageListener(this);

下图为RMQ的消费情况

ActiveMq和RabbitMq区别及其解析

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

Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。

ActiveMq和RabbitMq区别及其解析

ActiveMq和RabbitMq区别及其解析

ActiveMq和RabbitMq区别及其解析

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

--------------------- 

原文:https://blog.csdn.net/CLG_CSDN/article/details/90021459 

相关推荐

xinglun / 0评论 2020-06-14