一.RabbitMQ 和ActiveMq 对比
从下面的几个方面比较,RabbitMQ比ActiveMq更合适项目中使用。
(1)TPS比较
显示的是发送和接受的每秒钟的消息数。整个过程共产生1百万条1K的消息
ZeroMq 最好,RabbitMq次之, ActiveMq最差
(2)从社区活跃度
按照目前网络上的资料,RabbitMQ 、ActiveMQ 、两种者中,综合来看,RabbitMQ 是首选
(3)持久化消息比较
AcitveMQ 和 RabbitMQ 都支持 持久性或非持久性的信息交付。默认情况下,消息会存储到磁盘中,可以保证消息队列重启时数据的一致,避免消息的丢失
(4)技术点
可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统、社区 RabbitMq最好,ActiveMq次之
(5)高并发
从实现语言来看,RabbitMQ最高,原因是它的实现语言是天生具备高并发高可用的erlang语言。
二.RabbitMQ简介
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMq有以下几个特点:
(1)消息不丢失
(2)消息至少被成功消费一次
(3)不保证消息不重复,需业务方自行进行去重逻辑(版本号&状态机&msgid)
(4)不保证完全按照顺序消费
三.RabbitMq基础概念
首先明确一点就是生产者产生的消息并不是直接发送给消息队列Queue的,而是要经过Exchange(交换器),通过Binding将Exchange和Queue链接在一起,由Exchange再将消息路由到一个或多个Queue,当然这里还会对不符合路由规则的消息进行丢弃掉 。
四.Exchange 类型
(1)fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
应用场景:即实现单点发送消息,多点接收。广播到所有它知道的队列上,如群发信息等场景 。fanout转发器中不需要routingKey,指定也无效
(2)direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。当生产者(P)发送消息时Rotuing key=booking时,这时候将消息传送给Exchange,Exchange获取到生产者发送过来消息后,会根据自身的规则进行与匹配相应的Queue,这时发现Queue1和Queue2都符合,就会将消息传送给这两个队列,如果我们以Rotuing key=create和Rotuing key=confirm发送消息时,这时消息只会被推送到Queue2队列中,其他Routing Key的消息将会被丢弃。
应用场景:路由处理一些业务,比如,只把error message写到log file而将所有log message显示在控制台。
(3)topic(最常用的Exchange)
前面提到的direct规则是严格意义上的匹配,换言之Routing Key必须与Binding Key相匹配的时候才将消息传送给Queue,那么topic这个规则就是模糊匹配,可以通过通配符满足一部分规则就可以传送。它的约定是:
routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)
应用场景:多条件的路由处理,direct类型的消息通过绑定键转发到队列,但是存在一些局限性:它不能够基于多重条件进行路由选择,有可能希望不仅根据日志的级别而且想根据日志的来源进行订阅,这就需要topic类型的转发器来实现。
(4)headers(基本不用)
headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
五.spring boot集成rabbitMq
(1).添加pom.xml依赖
(2).application.yml配置文件主要是对rabbimq的配置信息
(3).首先在RabbitMq管控台中新建两个队列queueOne和queueTwo。
建好queue后,可以在控制台中查看queue有没有被消费等相关信息
(4).新建Exchange,type中可以指定ExChange的类型
(5)fanout方式,不需要制定Routing key
生产者:
发送消息时,Routing key为空
消费者:分别监听queueOne和queueTwo
结果:两个对列同时接收到了消息
(6).direct绑定关系
queueOne通过error.key来绑定directEX,queueTwo通过warn.key来绑定directEX
生产者
消费者:(同fanout)
结果:只有queueOne收到了消息。
(7).topic绑定关系
queueOne通过error.key来绑定topicEX,queueTwo通过*.key来绑定topicEX
生产者:
当routing key 为error.key
消费者:(同fanout)
结果:queueOne和queueTwo都接收到了消息
当routing key 为hello.key
结果:只有queueTwo都接收到了消息
(8).也可以手动的通过在控制台中给Exchange或者queue中发消息。