每日一博 | 手把手实现一条延时消息
前言 近期在维护公司的调度平台,其中有个关键功能那就是定时任务;定时任务大家平时肯定接触的不少,比如 JDK 中的 Timer、ScheduledExecutorService、调度框架 Quartz 等。 通常用于实现 XX 时间后的延时任务,或周期性任务; 比如一个常见的业务场景:用户下单 N 分钟未能支付便自动取消订单。 实现这类需求通常有两种方式: 轮询定时任务:给定周期内扫描所有未支付的订单,查看时间是否到期。 延时消息:订单创建的时候发送一条 N 分钟到期的信息,一旦消息消费后便可判断订单是否可以取消。 先看第一种,这类方式实现较为简单,只需要启动一个定时任务即可;但缺点同样也很明显,这个间隔扫描的时间不好控制。 给短了会造成很多无意义的扫描,增大数据库压力,给长了又会使得误差较大。 当然最大的问题还是效率较低,随着订单增多耗时会呈线性增长,最差的情况甚至会出现上一波轮询还没有扫描完,下一波调度又来了。 这时第二种方案就要显得靠谱多了,通过延时消息可以去掉不必要的订单扫描,实时性也比较高。 延时消息 这里我们不过多讨论这类需求如何实现;重点聊聊这个延时消息,看它是如何实现的...

