前言
延时队列的作用不再累述
本文使用rabbitmq的queue可以设置ttl时间,将到期的message设为死信,message会被push到delay_queue,消费delay_queue即可实现延时队列功能
场景
先假设这样一个场景:
小明在外卖平台下个一个订单,如果超过10分钟未支付,则系统自动取消订单,并推送给用户“订单已取消”信息。
开发思路:
下订单时就将订单orderId push到订单队列order_queue,并设置次条message的有效期为10分钟,当10分钟后此条message到期,会将此条message转化为死信push到exchange,将exchange和queue进行绑定,开一个/多个消费者消费queue,并判断queue中message订单是否已支付,若未支付则推送通知,取消订单。
流程图,未考虑消息消费失败的情况
核心代码
对RabbitMQ进行简单的封装
namespace RabbitMQ;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
class RabbitMQ
{
private $host = '127.0.0.1';