定时任务发展历程 | 青训营笔记

155 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 7 天

春节集卡

每年春节,各大互联网公司都会推出一些好玩的活动,比如说像支付宝,有集五福,自觉跳动,它就会有这个春节集卡,然后刚刚同学们听到上抖音发分20亿,其实就是今年抖音的春节活动。

玩法如下:

  • 用户通过完成指定任务,提升DAU
  • 用户抽卡,集卡,获得开奖资格
  • 瓜分现金

春节活动是互联网公司的重中之重,对技术的挑战也非常大

通过扫描脚本扫描用户的季卡信息,对数据进行汇总计算

根据总金额计算每个用户可以获得的金额

在指定时间进行定时开奖

这个过程要面临一些技术挑战:

  • 亿级用户规模
  • 亿级资金规模
  • 百万级读写QPS

这样的场景就提出了一些新的需求:

自动化 + 定时执行 + 海量数据 + 高效稳定

自动化:整个计算跟发奖的过程是全自动的

定时执行:除夕的20点定时发展,那这个时间一定是准确的,一定是要在这个时间节点完成的

海量数据:参与的用户量有几亿的用户,集卡的数据可能是这个数量数量的几倍或几十倍的这样一个量级

为了应对这些挑战,就要依赖今天的主角:分布式定时任务

发展历程

Windows批处理

Case1:10分钟后Windows电脑自动关机

自动关机.bat

shutdown -s -t 600 # 600秒,十分钟

Windows任务计划程序

Case2:每日12:00自动打卡

抓包分析实现打卡过程,通过Python写一个定时打卡的程序,再添加到定时任务中

Linux-CronJob

Case3:每天2:30定时清理机器日志

优点:操作简单、稳定可靠

缺点:只能控制单台机器,无法使用于其他操作系统

单机定时任务-Timer、Ticker

Case4:每隔五分钟定时刷新本地缓存数据

Java

Go

缺点:只能单台机器执行

单机定时任务-ScheduleExecutorService

Case5:每隔5分钟定时执行多个任务

当需要执行多个任务时,如果每个任务启动一个线程,会很占用系统资源

使用ScheduleExecutorService可以实现线程服用,不需要每个任务都创建新的线程

缺点:依然是单机可用

任务调度:Quartz

市面上任务调度最强大的工具

缺点:没有负载均衡机制、分布式支持不好