前言
在日常开发过程中,我们常常会遇到一些需要延迟处理的任务,如:当用户下单后未付款,30分钟后关闭订单。在对于实时性要求不高、简单的业务场景,我们往往可以采用定时任务的方式(每隔几分钟轮询一次数据库或redis)来实现,当要求实时性较高时可以考虑采用消息队列的延迟队列进行实现,不仅可以对业务解耦,具有更高的灵活性和扩展性,同时相比与轮询,不占用数据库昂贵的资源。
一、如何实现延迟队列?
这里我们需要预先了解 rabbitmq 的三个队列参数:
- x-message-ttl: 消息过期时间,单位 ms;当投递的消息超时会被丢弃,如果设置了投递队列(从参数翻译则是死信队列)则会被投递到指定队列,通过这个参数我们可以指定当消息在一段时间后投递到我们的处理队列中进行处理。
- x-dead-letter-exchange:死信(触发超时、丢弃时投递的)队列交换机。
- x-dead-letter-routing-key:死信(触发超时、丢弃时投递的)队列路由键。
二、操作样例
- 创建一条带超时和死信投递参数的队列,这里超时设置为 5s。
- 创建死信队列、交换机,并将队列绑定到交换机中。
- 消息投递测试
在 delay5s 队列中投递一条测试消息。
观察到在延迟 5s 后,消息被投递到了 work-queue 中
总结
至此实现 rabbitmq 的延迟队列。