如何实现简单的定时全局唯一任务?

一个分布式系统中

需要每小时/每天/每月执行一个或若干个任务

要求一是定时,时间不求很准确;二是全局唯一,也就是这个任务全局只有一个实例在执行

更多的,要有一定的容错性,比如程序崩溃、redis/nsq崩溃,即使当前任务执行失败,下次任务的消息也能照样发出。

同时也要具备一般的消息队列/任务系统支持的特性。

当然,最重要的,简单


现有的依赖有redis、nsq。

不好意思,不知道为什么,公司不准引入新的依赖

已邀请:

h12 - https://h12.io/about

赞同来自: goldpasser

先纠正一个常见的误区:很多人觉得一个任务定时调度系统一定要基于或包含一个消息队列,错!


任务调度的核心数据结构是 job pool 而不是job queue,当然可以用queue来实现pool,但是那样反而非常别扭:第一,queue是有顺序的,但是job其实没顺序,有可能几个job并发执行。第二,一旦任务失败,还需要重新把job塞到另一个队列,如果再失败。。。


job pool里的每个job其实都是一个状态机,在几个状态之间转换:created, pending, running, failed, completed。这个pool显然是一个数据库,但是不一定要用RDBS来实现,用ectd也可以,好处是同时还可以支持选主,这样主来执行任务就可以了。


etcd不一定引入依赖,因为可以嵌入到Go服务里,参考:https://godoc.org/github.com/coreos/etcd/embed



lifei6671 - PHPer

既然是分布式,肯定得引入Zookeeper或ETCD吧。要不然分布式协调谁来做?

定时任务就别做分布式了,单机就行了

要回复问题请先登录注册