Springboot整合RabbitMQ(三)——Topic主题交换机

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot整合RabbitMQ(三)——Topic主题交换机相关的知识,希望对你有一定的参考价值。

参考技术A 主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键是有规则的。简单地介绍下规则:
* (星号) 用来表示一个单词 (必须出现的)
# (井号) 用来表示任意数量(零个或多个)单词

通配的路由键是跟队列进行绑定的,举个小例子:
队列Q1路由键为 *.TT.* ,队列Q2路由键为 TT.# ;
如果一条消息携带的路由值为 A.TT.B ,那么队列Q1将会收到;
如果一条消息携带的路由值为 TT.AA.BB ,那么队列Q2将会收到;

当一个队列的绑定键为 # (井号)的时候,这个队列将会无视消息的路由键,接收所有的消息。
当 * (星号)和 # (井号)这两个特殊字符都未在绑定键中出现的时候,此时主题交换机就拥有的直连交换机的行为。所以主题交换机也就实现了扇形交换机和直连交换机的功能。

声明队列和交换机。

根据主题交换机的特性,携带路由键 topic.man 的消息将会发送到 topicQueue1 和 topicQueue2 这2个队列中,携带路由键 topic.woman 的消息只会发送到 topicQueue2 队列中。

启动服务,用 postman 分别调用发送消息的2个接口。

可以看到已经有3条消息推送到队列中,等待被消费。

topicQueue1 上有1条消息等待被消费, topicQueue2 上则有2条消息等待被消费。

通过注解 @RabbitListener 指定要消费的队列。

重新启动服务,可以看到控制台打印输出,说明该条消息已经被消费者消费成功了。

Springboot整合RabbitMQ(一)——Direct直连交换机
Springboot整合RabbitMQ(二)——Fanout扇形交换机

SpringBoot整合RabbitMQ之典型应用场景实战三

实战前言
RabbitMQ 作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用,比如业务服务模块解耦、异步通信、高并发限流、超时业务、数据延迟处理等。前两篇博文我介绍分享了RabbitMQ在业务服务模块异步解耦以及通信的实战业务场景,感兴趣童鞋可以前往观看:
1.http://blog.51cto.com/13877966/2297056
2.http://blog.51cto.com/13877966/2297182

这篇博文我们继续介绍分享RabbitMQ死信队列实战以及在支付系统中支付过程超时则自动失效其下单记录 这样的业务场景!

RabbitMQ 实战:死信队列认识与场景实战

死信队列认识

死信队列,又可以称之为“延迟/延时队列”,也是队列的一种,只不过与普通的队列最大的不同之处在于创建时的组成成分不同,创建死信队列的“成分”将不仅仅只是:名称、持久化、自动删除等基本属性,还包含了死信交换机、死信路由甚至还有TTL(Time-To-Live)即队列中消息可生存的时间。

死信队列其实最大的作用是可以实现消息或者数据延迟/延时处理,而且还可以动态的设定延迟的时间,即动态设定 TTL。典型的业务场景很多,在这里就不一一列举了,总之,凡是业务中需要延迟一定时间再处理的数据均可以将其压入死信队列中,等待一定的时间后再执行真正的处理逻辑!

下面是死信队列在创建、绑定、生产消息、消费消息过程的结构流程图,在这里其实已经很明确的指出死信队列的创建跟绑定逻辑 以及 真正监听消费处理消息的队列的绑定逻辑。图中问题的答案为:当入死信队列的消息TTL一到,它自然而然的将被路由到 死信交换机绑定的队列 中被真正消费处理!!!

技术分享图片

死信队列场景实战

有了上面的流程图做指导,接下来,我们将用死信队列实战这样的一个业务场景:用户在商城下单成功并点击去支付后在指定时间未支付时自动失效!于是乎,我们需要创建两个消息模型,在 RabbitmqConfig 实施:

  1. 死信队列:用于设定指定的待支付的交易订单号在指定的 TTL(单位为 ms)后何去何从!
  2. 真正队列:用于监听消费处理指定的交易订单号,即判断该交易订单号是否已完成,如果否,则失效之!

技术分享图片

技术分享图片

接下来是我们的生产端的逻辑:用户商城下单的处理!

技术分享图片

接下来是等待固定的 TTL:在这里设定的是 10s,当消息入死信队列 10s 后,将自然而然的将消息路由到下一个中转站,即真正的消费监听处理队列进行处理:判断该笔交易订单号是否已经付款,如果否,则失效之!

技术分享图片

可以将该服务跑起来,然后发起 controller 的用户下单请求,会发现消息入死信队列后不会立马被消费,等待 10s 会,消息会被路由到真正的消费队列中进行处理,这一现象可以在 MQ 的后端控制台应用中看到!

总结:到此我们的死信队列已经实战完毕,回顾我们所介绍的历程,其实核心重点在于上面的那张 “死信队列的结构流程图”,理解了这个结构流程图中的相关组件及其流程,则在实战各种需要延时处理的业务场景将得心应手,包括如何创建死信队列,如何面向生产端绑定死信队列,如何面向消费端绑定真正的队列等等!而对于死信队列的实战场景,前面也介绍过了:凡是需要等待一定时间或者需要缓一缓特定时间的业务、数据均可以通过死信队列来实现!

回顾与总结

RabbitMQ 的认识与实际业务场景的实战到此我都已经介绍完毕,总体而言,RabbitMQ 作为目前应用相当广泛的消息中间件,在我们实际系统的业务模块中具有重要的作用,特别是刚开始介绍的几种消息模型以及死信队列模型在微服务系统、分布式系统中均可充当重要的角色,其中我们实战的业务场景包括业务服务模块解耦异步通信(异步发送日志、异步发送邮件);另外,我们还介绍了消息确认机制,这是一种 MQ 确保消息能被消费者消费的机制,对于一些业务模块也是有广泛的应用;除此之外,我们还模拟实战了秒杀系统、抢单系统这样的业务场景下 RabbitMQ 的作用:限流、排队缓压、减少数据库读写锁的发生等等!

彩蛋:本博文介绍了RabbitMQ死信队列及其业务场景的实战,相关源码数据库可以来这里下载!

地址:https://pan.baidu.com/s/1KUuz_eeFXOKF3XRMY2Jcew
学习过程有任何问题均可以与我交流,QQ:1974544863!感兴趣的童鞋可以关注一下我的微信公众号!

技术分享图片

附注:debug已经将RabbitMQ的实战整理成了视频教程,感兴趣的童鞋可以加上面公众号或者个人QQ交流!

以上是关于Springboot整合RabbitMQ(三)——Topic主题交换机的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot整合RabbitMQ实现死信队列

RabbitMQ笔记SpringBoot整合RabbitMQ之simple容器(生产者)

RabbitMQ从概念到使用从Docker安装到RabbitMQ整合Springboot1.5w字保姆级教学

RabbitMQ笔记SpringBoot整合RabbitMQ之simple容器(消费者)

SpringBoot系列5SpringBoot整合RabbitMQ

RabbitMQ整合SpringBoot