安装:
docker 启动命令
下载镜像:docker pull rabbitmq:3.7.7-management
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9
RabbitMq 实现延迟队列:
MabbitMq是没有延迟队列的功能的,但使用RabbitMq的两个特性可以帮助我们实现这个功能;
TTL(Time-To-Live Extensions)
RabbitMq 运行我们为队列或者效期设置有效期;TTL表明了一条消息可在队列中存活的最大时间,单位为毫秒;
如果既配置了消息的TTL,又配置了队列的TTL,那么较小的那个值会被取用。
DLX(Dead Letter Exchange)
设置了TTL的消息在过期后会成为Dead Letter,如果队列设置了Dead Letter Exchange(DLX),
那么这些Dead Letter就会被重新publish到Dead Letter Exchange,通过Dead Letter Exchange路由到其他队列;
将RabbitMQ的TTL和DLX特性结合在一起,即可实现一个延迟队列。
延迟队列根据使用场景又可以分为以下两种:
延迟消费
延迟消费是延迟队列最为常用的使用模式。如下图所示,生产者产生的消息首先会进入缓冲队列。通过RabbitMQ提供的TTL扩展,这些消息会被设置过期时间,
也就是延迟消费的时间。等消息过期之后,这些消息会通过配置好的DLX转发到实际消费队列,以此达到延迟消费的效果。
延迟重试
延迟重试本质上也是延迟消费的一种,但是这种模式的结构与普通的延迟消费的流程图较为不同,所以单独拎出来介绍。
消费者发现该消息处理出现了异常,比如是因为网络波动引起的异常。那么如果不等待一段时间,直接就重试的话,很可能会导致在这期间内一直无法成功,
造成一定的资源浪费。那么我们可以将其先放在缓冲队列中,等消息经过一段的延迟时间后再次进入实际消费队列中,此时由于已经过了“较长”的时间了,
异常的一些波动通常已经恢复,这些消息可以被正常地消费。
springboot实现延迟消费代码:
配置application.yml配置文件:
创建一个配置类,创建交换器和和一个队列实现DLX,一个死信队列
创建交换器
创建一个队列,启用DLX功能
创建一个普通队列,作为死信队列
最后进行队列与交换器的绑定,设置绑定的路由键
通过配置类,springBoot项目启动就连接RabbitMq创建我们要使用的交换器和队列,当项目重复启动时,RabbitMq已经有了我们要的交换器和队列时,RabbitMq不会再重新进行创建操作;
注意这里,RabbitMq不可以创建不同模式的同名交换器,或启用不同功能的同名队列;
//---------消费端
消费RabbitMq消息,创建一个类并放入spring容器;使用注解@RabbitListener和@RabbitHandler实现;
//------------------------------------------------------------------配置类创建交换器和队列的构造方法说明
交换器:
- // 参数1 name :交互器名
- // 参数2 durable :是否持久化
- // 参数3 autoDelete :当所有消费客户端连接断开后,是否自动删除队列
- new TopicExchange(name, durable, autoDelete)
队列:
- // 参数1 name :队列名
- // 参数2 durable :是否持久化
- // 参数3 exclusive :仅创建者可以使用的私有队列,断开后自动删除
- // 参数4 autoDelete : 当所有消费客户端连接断开后,是否自动删除队列
- new Queue(name, durable, exclusive, autoDelete);