springboot-rabbitmq消息发送实践
十五从军征,八十始得归。
1 前言
在前文中已经介绍了 rocketmq
的消息发送,在本文将介绍另外一个常用的消息中间件-rabbitmq
。mq
在分布式系统开发中是不可或缺的一部分,在本文中将结合自己的实践经验,介绍使用 rabbitmq
的几种常用的方式。
2 环境准备
为了使用方便也是为了减少系统的应用数量,这里使用 docker 来安装 rabbitmq,具体的操作如下所示:
# 拉取 rabbitmq docker 镜像,这里使用的是 rabbitmq:management,带有控制台可以方便查看运行情况
docker pull rabbitmq:management
# 启动docker 镜像
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
# 访问 rabbitmq 管理后台,账户密码 guest/guest
localhost:15672
rabbitmq
的架构图如下所示,Broker 即消息队列进程,可以包含多个虚拟主机 Virtual Host
, 每个虚拟主机下有多个交换机 Exchange
和队列 Queue
,交换机和队列之间存在着绑定关系,生产者通过连接Connection
中的通道 Channel
和某个 Virtual Host
中的交换机连接,通过路由键将消息路由到对应的队列中,消费者通过监听具体的队列来获取消息。
在使用 rabbitmq
时,需要先引入项目依赖,rabbitmq
使用的是 amqp
协议处理消息信息,这里需要说明的是 Broker
和 Producer
之间以及 Broker
和 Consumer
之间的连接都是 TCP
连接。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>3.1.6</version>
</dependency>
如下图所示,左侧是本次实践创建的 exchange
、routing_key
以及 queue
信息,右侧是 springboot
使用 rabbitmq
的配置,这里需要说明的是 address
和 host/port
只需要配置一项即可。
3 rabbitmq 消息类型
在本节中,主要介绍 direct
、 topic
、 fanout
三种类型的消息:
1 fanout, 也称广播模式,publish-subscibe 模型
因为该模式是发布订阅,属于广播消息,交换机和队列的绑定不需要指定路由键即可实现消息的转发。
2 direct 定向模式消息
生产者发送消息到交换机后,需要根据路由键路由到指定的队列中,交换机和队列需要指定路由绑定关系,交换机和某一个队列之间可能会存在多个路由绑定关系。
3 topic 通配符模式消息
在 topic 模式下,交换机和路由的绑定关系比较灵活,由于采用了 # 和 * 通配符(# 匹配一个或者多个次, * 匹配的词数是 1 个)。此种模式下,队列可以根据通配符来匹配需要处理的消息。
如下图所示,即三种不同消息模式下的说明。
通常情况下,消息都要经过交换机根据绑定关系路由到对应的队列中由消费者消息。除了以上的三种模式消息,还有基本消息模型和work
消息模型,两种消息的共同点是发送消息时只需要指定路由键即可,交换机可以为空,不同点是,基本消息只有一个消费者监听队列,但是对于work
模式有多个消费者消息消息,且消费者之间是竞争关系,同一条消息只能被一个消费者消费。
4 rabbitmq 实践
不论哪种消息模式,都需要指定消息的类型。交换机、队列和绑定关系的配置如下图所示。如图所示,三种消息模式的配置大同小异。都需要声明交换机、队列和绑定关系的Bean,以及指定对应的路由键。
在发送消息时,需要指定消息发送的交换机,路由键以及消息报文。
在发送消息后需要根据业务需要实现消息的确认和消息的拒收处理。
在消息消费时,有两种消费的方式,不过都需要使用 @RabbitHandler
和 @RabbitListener
,并且后者需要指定对应的监听队列。可以使用实体类接收消息,也可以接收 message
和 channel
,后者可以进行消息的确认以及拒接。通常需要根据业务场景来确定采用哪种方式来接收。
5 总结
本文中主要介绍了 rabbitmq 的消息类型,以及消息发送和消费的实践,rabbitmq 作为常用消息中间件,在日常技术开发中有着广泛的应用,总结其常用的使用方式,可以很好的为后续开发提供借鉴。所涉及的代码已经上传至 github
, 欢迎大家点赞关注。项目 github
地址 springboot-auth。
转载自:https://juejin.cn/post/7367948180543537202