持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
什么时候需要用到延时队列
- 在网上购物下单后未付款的订单,会锁住库存,超过了一定的时间没有付款,订单会自动取消,库存会释放。
- 在网上购物下单,在我们收到快递后有一个确认收货的动作,只有在确认收货后平台才会把钱转给商家,但是为了避免用户一直不点确认收获,我们就需要系统在快递送达后一定时间内自动确认收货。
- 在建筑工地上,有些设备需要在开启后运行一段时间后自动关闭。
Redis实现方式
1.利用Redis有序集合score排序的高性能特性。
2.利用zadd score value命令一直往redis中生产延时消息,score为时间戳,value为任务内容。
3.再使用zrangebyscore key min max withscore limit 0 1 查询最早的那条任务进行消费,需要判断score是否大于当前系统时间,如果小于就代表最早那条消息消费时间还没到。
通过RabbitMQ队列实现
1.定义一个延时队列,通过设置x-message-ttl(过期时间),x-dead-letter-exchange(消息过期后消息投递到这个交换机),x-dead-letter-routing-key(消息过期后投递routeing-key)。
2.消息过期后会投递到死信队列,通过routing-key的绑定来投递。
3.消费者就可以消费死信队列的延时消息了。
通过RocketMQ队列实现
1.定义一个队列,把延时时间相同的消息投递到同一个队列,这样做是为了保证消息处理的顺序性。 2.队列中的延时消息按照递增顺序排序,然后通过一个定时器来轮询处理队列中的消息。 3.但是RocketMQ只支持特定的延时时间。
除了以上几种实现方式之外还有很多其他方案的,每种方案都有其优缺点,大家需要根据自己的实际开发需求来做技术选型。
谢谢观看! streetlamp 敬上!