分布式定时任务

定时任务的目标是在指定的时间或间隔来周期性启动任务。在Linux系统上,经常用crontab来管理定时任务。

定时任务与幂等性

定时任务周期性执行制定的任务,但除此之外具体任务的功能则很难知道

  • 有的是幂等的,可以多次执行,比如垃圾回收任务
  • 有的则不能多次之行,比如E-mail通知任务
  • 有的任务没有执行也是可以接受的,比如垃圾回收任务
  • 有的则必须在指定间隔来之行,比如每月一次的工资计算任务

所以,并不能定义一个通用的适用所有情况的Cron服务。在实践中,一般倾向于最差情况下跳过某个任务的执行,而不会冒有可能将任务执行两次的风险。

Google Cron

在大规模部署场景中,Cron需要分布到多台机器上,并将Cron进程与任务分开,再由任务分发系统选择机器来运行任务。当然,任务分发也会带来时延,甚至会出现节点时效而重新调度,这需要一些恢复服务来降低系统的不可用时间。

Google Cron的构建过程

  • 跟踪任务状态:系统内部存储状态信息(而不是使用分布式文件系统,主要是为了降低延迟,减少依赖)
  • Paxos保证多副本之间的一致性
    • 采用Fast Paxos,领头人负责启动Cron任务,而追随者仅同步状态
    • Cron任务启动时也需要完成Paxos协议同步通知其他副本
    • 领头人对任务分发具有独占性,角色变化时要立刻终止和分发系统的交互
  • 处理意外失败:保存任务状态,这样即便领头人崩溃了,新当选的领头人也可以根据状态查询到之前的状态
  • 避免惊群效应,比如避免所有任务都在午夜执行,分散任务到整个时间序列

Kubernetes CronJob

Kubernetes也有对应分布式定时任务,即CronJob,参考这里

Feisky wechat
微信公众号订阅