1.需求描述
之前笔者接触过一些营销业务场景,比如说:
- 用户注册未登录过APP第二天早上10点发一条营销短信促活
- 红包过期前两天短信通知,下午16:00发送
- 等等定时任务处理业务。
采用的技术方案是定时任务扫数据汇总表,分页读取一定数量然后处理
然而随着业务的发展,业务多元化,遇到了以下场景:
- 拼团砍价活动过期前半小时提醒
- 订单提交半小时内没有完成支付,订单自动取消,库存退还
- 用户几天内没有操作过系统,发放激活短信
以上场景处理时间不是固定的某个点,而是业务发生的时间推迟一段时间,针对以上的业务场景,我们考虑可以根据不同业务建表,然后每隔一段时间去定时扫表,各自处理业务。
但是随着业务增加,表泛滥,而且此类业务其实有很多相同的地方,那么我们可以考虑把相同逻辑抽离出来,利用延迟队列来处理任务
2.延时队列设计目标
- 可靠性:任务进入延时队列之后,必须被执行一次
- 高可用性:支持多实例部署
- 实时性:允许一定时间误差,当然误差越小越好
- 可管理:支持消息删除
- 高性能:数据量大的情况下也能保证高性能