最近接到一个需求,要求在数据状态变更10分钟后向用户推送一条微信消息;
分析: 按照传统做法,这个可能要使用定时任务去扫描对应表中的数据,但是这样做会造成两个问题:
1.频繁扫描数据库,会增加数据库开销;
2.对于10分钟的时间上面不是那么准确;
这里使用RabbitMQ的延迟队列来实现:
实现步骤:
主要是在RabbitMQ控制台完成,也可以使用代码,我比较懒;
1.新建Exchange,用来分发消息
![](https://img.haomeiwen.com/i13489956/0b96df359e363992.png)
2.创建消费队列,用来承接延迟队列里面时间到期后的数据;
这里的队列就是一个普通的消费队列,用来进行正常的业务;
![](https://img.haomeiwen.com/i13489956/aaf77be0c97f110e.png)
3.创建延迟队列,用来存储对应时间的数据
注意下面这三个参数
x-dead-letter-exchange --这个暂时用不到,但是不写创建不了延迟队列;
x-dead-letter-routing-key --这个表示此延迟队列的时间到期后往哪个队列里面放;
这里是放到上面创建的消费队列中;
x-message-ttl --这是消息过期时间,单位是毫秒;
![](https://img.haomeiwen.com/i13489956/9c17559e33a7a592.png)
4.延迟队列绑定Exchange
将延迟队列绑定在上面创建的Exchange上面,注意要有个Routing kyy,在代码里面推消息的时候要使用,这样Exchange才能识别将消息给哪个延迟队列;
![](https://img.haomeiwen.com/i13489956/b529803d719f1457.png)
5.代码中将消息推到Exchange就好,会分发到对应Routing key绑定的队列,然后到时间后会转放到消费队列,进行正常的业务;
![](https://img.haomeiwen.com/i13489956/2647ea83c3438d45.png)
网友评论