背景
在工作中,经常需要用到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)算法详解》