落羽成舟 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)
下图为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相匹配,才会进行收发消息,不仅仅是队列名的匹配,
Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
在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