运营明明设置了活动开始时间,为什么到点没生效?聊聊动态定时任务
# 背景
“小猫,赶紧地看看生产啊,咋回事啊,我明明设置了活动开始时间是今天的11:20,为什么到现在活动还是未开始状态,页面上倒计时已经过了,赶紧的啊,不然要有客诉了...”
“哦哦,好,把活动编号给我一下。我查一下”
...
自从运营妹子们工位搬到技术部同学旁边之后,小猫就彻底和好日子说再见了。除了要忍受妹子们每日家长里短、八卦满天飞以及尖声阴阳怪笑之外,还得被她们围攻。
曾经有一个西方的勇者说过“一个女人等于500只鸭子”,那么小猫近期的生活可想而知了,基本是处于水深火热之中,他的内心彷徨,呐喊“人生苦短,奈何要干程序员呢?”
闲言少叙,书归正传。承接上面的问题,为什么定时设置了活动时间,却是延迟了还未开始呢?
那么接下来,咱们就从技术方案的设计实现上来看一下。
首先咱们来看一下小猫的活动模型:
CREATE TABLE `Activity` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`activity_code` varchar(50) NOT NULL COMMENT '活动编号',
`activity_name` varchar(60) NOT NULL COMMENT '活动名称',
`activityChannel` tinyint(4) NOT NULL DEFAULT '1' COMMENT '活动频道:1.抢购活动,2.秒杀活动',
`start_time` datetime(3) NOT NULL COMMENT '活动开始时间',
`end_time` datetime(3) NOT NULL COMMENT '活动结束时间',
`discount_level` tinyint(4) NOT NULL DEFAULT '1' COMMENT '优惠级别 1-sku级别',
`discount_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '优惠类型 1-促销价 2-打折 3-减价',
`status` int(11) NOT NULL DEFAULT '0' COMMENT '活动状态 0-初始化中 1-已审核(只要一个商品审核通过了,就更新活动状态到已审核) 10-活动已开始 20-活动已结束'
.....
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22427 DEFAULT CHARSET=utf8mb4 COMMENT='活动表'
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
上述基本就是活动模型的大概了,上述我们需要重点关注的就是活动开始以及活动结束时间还有一个状态。接下来咱们来简单看一下运作流程,如下图:
从上述的流程中,我们发现,活动状态的流转完全是依赖于定时器的,另外定时器是三分钟才执行一次,所以当前时间真的到点了,也可能之后过来三分钟状态才会变更,当然此处的三分钟还是比较乐观的情况下,当数量增大的时候,其读表都要花时间,尤其是数据量大的时候,所以延迟可能会更久。显而易见,这种设计方案在业务实时性要求不是很高的情况下勉强能撑得住,但是一旦对实时性要求比较高的时候,可能就会出现小猫的困扰了。那么对于这样的实时性要求比较高的定时器,大家一般都怎么实现呢?
由浅入深接下来就和大家一起聊聊定时任务。
# 关于任务调度
说到定时任务,我们还是要从任务调度说起,所谓的任务调度也就是指系统为了按预定的时间和频次自动完成特定任务的过程。
咱们从最初的JDK的任务调度开始说起,