Springboot整合RabbitMQ

一.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中发消息。

图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值