产品中心
A16B-1210-0590
A16B-1210-0590
A16B-1210-0590
什么是定时器
定时器(Timer)是一种在指定时间开始执行某一任务的工具(也有周期性反复执行某一任务的Timer,我们这里暂不讨论)。它常常与延迟队列这一概念关联。那么在什么场景下我才需要使用定时器呢?
我们先看看以下业务场景:
当订单一直处于未支付状态时,如何及时的关闭订单,并退还库存?
如何定期检查处于退款状态的订单是否已经退款成功?
新创建店铺,N天内没有上传商品,系统如何知道该信息,并发送激活短信?
为了解决以上问题,简单直接的办法就是定时去扫表。每个业务都要维护一个自己的扫表逻辑。当业务越来越多时,我们会发现扫表部分的逻辑会非常类似。我们可以考虑将这部分逻辑从具体的业务逻辑里面抽出来,变成一个公共的部分。这个时候定时器就出场了。
二、定时器的本质
一个定时器本质上是这样的一个数据结构:deadline越近的任务拥有越高优先级,提供以下几种基本操作:
Add 新增任务
Delete 删除任务
Run 执行到期的任务/到期通知对应业务处理
Update 更新到期时间 (可选)
Run通常有两种工作方式:1.轮询,每隔一个时间片就去查找哪些任务已经到期;2.睡眠/唤醒,不停地查找deadline近的任务,如到期则执行;否则sleep直到其到期。在sleep期间,如果有任务被Add或Delete,则deadline近的任务有可能改变,线程会被唤醒并重新进行1的逻辑。
它的设计目标通常包含以下几点要求:
支持任务提交(消息发布)、任务删除、任务通知(消息订阅)等基本功能。
消息传输可靠性:消息进入延迟队列以后,保证至少被消费一次(到期通知保证At-least-once ,追求Exactly-once)。
数据可靠性:数据需要持久化,防止丢失。
高可用性:至少得支持多实例部署。挂掉一个实例后,还有后备实例继续提供服务,可横向扩展。
实时性:尽大努力准时交付信息,允许存在的时间误差,误差范围可控。