延迟队列实现原理

104 阅读2分钟

背景

在工作中,经常需要用到MQ中间件实现、业务等场景解耦。MQ中间件还有一个被大家广泛使用的功能,延时队列。举个栗子,在外卖场景下,下订单后15min未付款则关闭订单,这种场景通常不赞成使用定时调度扫表的方式实现,原因就是订单量过于庞大,导致数据库压力居高不下。因此,基于MQ的延时队列就发挥了巨大作用。

消息中间件-延时队列

RocketMQ-基本介绍

上面这张图,想必接触过rocketmq的人都知道吧。

producer:发送方,发送消息

nameServer:注册中心,负责producer与broker的通信、consumer与broker的通信

broker:存储中心,负责消息管理(消息存储,路由路径,消息推送)

consumer:接收方,接收消息

RocketMQ延迟队列实现(代码级)

RocketMQ 延时队列是在broker模块实现的。

Broker收到消息后,根据消息类型,找到SendMessageProcessor处理类,对消息信息,topic,queue等等进行校验。校验完成后写入文件,然后刷盘存储。只是在写文件过程中有个加锁的操作

基于TimeWheel的自定义延迟队列实现(代码级)

TimeWheel

一种高效批量管理定时任务的调度模型。时间轮一般会实现成一个环形结构,类似一个时钟,分为很多槽,一个槽代表一个时间间隔,每个槽使用双向链表存储定时任务。指针周期性地跳动,跳动到一个槽位,就执行该槽位的定时任务。

具体实现可参考:github.com/leooop-al/t…


参考文档:

cloud.tencent.com/developer/a… 《如何在MQ中实现支持任意延迟的消息?》

cloud.tencent.com/developer/a… 《Dubbo定时任务时间轮(Time Wheel)算法详解》