百万级定时任务如何设计?有什么好的框架呢?

2019-03-05 00:02:37 +08:00
nezhaxiaozi1015  nezhaxiaozi1015

我这现在有个需求就是我们的产品可以让我们的用户预约一个时间来执行一次或者周期性的执行。

在看了 TBSchedule 和 Elastic-job 之后好像他两不适合创建百万用户级的子任务。虽然执行的功能也就两个,但是用的预约量可能是百万级的。

之后还想过通过 mysql 扫表的方式来实现,但是这种方式太暴力了。有没有什么好的方式呢?

7397 次点击
所在节点   程序员  程序员
37 条回复
Mirana
Mirana
2019-03-05 00:42:49 +08:00
单实例 instance 最大负载流量 i1 存储 i2
总共流量 max1
总存储能 max2

然后分片数就是 slices = max(max1/i1,max2/i2)

然后前端做个 hash,找到对应的 slice 就好,如果考虑高可用可以用主从互备,也可以一致性哈希

单实例的实现就是 sorted set,redis 里就有,按照预定的 interval 轮询,这样最大的误差就是 interval,自己实现一个也不难
nezhaxiaozi1015
nezhaxiaozi1015
2019-03-05 00:49:12 +08:00
@j2gg0s 👌
nezhaxiaozi1015
nezhaxiaozi1015
2019-03-05 00:51:04 +08:00
@jokerlee 🤣,一秒一百万应该是估计的最大流量了,一般应该是达不到的
JCZ2MkKb5S8ZX9pq
JCZ2MkKb5S8ZX9pq
2019-03-05 00:55:26 +08:00
我自己是 mongodb 写的,主要是任务的取出逻辑,成功判断和之后的循环再加入任务池的处理。不过时间是比较久,差不多一天才百万。
binux
binux
2019-03-05 01:37:23 +08:00
@nezhaxiaozi1015 #4 队列只增加不删除,执行的时候 check 一下数据库是不是 update to date 的执行时间 /规则就好了。毕竟你任务执行的时候也要更新下次执行时间不是。
xuanbg
xuanbg
2019-03-05 04:50:39 +08:00
每秒百万?我想你还是先考虑预约怎么进来的问题吧。。。这个量级不是随便搞搞就能扛得住的。
sampeng
sampeng
2019-03-05 07:07:13 +08:00
每秒百万…讲真不是随便搞搞就可以的。光考虑读了。百万任务你还要分发处理,还要写,子任务计算的 cpu 和内存消耗都是海量,系统复杂的还要调用其他接口,还要保证数据一致性…

别动不动就是每秒百万并发好不好…这是一个及其恐怖的并发…
sampeng
sampeng
2019-03-05 07:08:33 +08:00
先随便搞搞就行了。不行再去改。哪有那么多银弹
nezhaxiaozi1015
nezhaxiaozi1015
2019-03-05 08:46:43 +08:00
@sampeng 嗯嗯是啊😂,先堆机器堆服务看看
123132116558
123132116558
2019-03-05 08:56:20 +08:00
THaGKI9
THaGKI9
2019-03-05 09:50:50 +08:00
用 kafka 存任务队列好像适合你这个场景,消费者也充当任务执行者的身份
zjb861107
zjb861107
2019-03-05 10:12:32 +08:00
Airflow,听过但没用过
sujin190
sujin190
2019-03-05 10:37:08 +08:00
https://github.com/snower/forsun

推荐下之前设计的吧,使用系统定时器触发定时,长时间运行也不会出现偏差,持久化使用 redis,虽然每秒执行百万定时任务不大可能,但是管理几百万,上千万的定时任务还是很轻松的,执行器支持常用的 shell、http、redis、mysql 外也可以通过扩展自定义执行器,比如压入分布式队列之类的
bzzhou
bzzhou
2019-03-05 13:26:04 +08:00
之前做过类似的,千万量级也没有压力,基本套路如下:

1. 直接用 MySQL 存储,超时时间戳加索引
2. 周期性从 MySQL 中将超时的任务批量取出,缓存在内存中
3. worker 直接从内存中拿定时器任务,进行处理;处理完毕后更新 mysql 中的状态
kanepan19
kanepan19
2019-03-05 13:36:25 +08:00
可以直接程序实现或者用 消息队列的延迟队列实现,并且结合 redis 做持久化来判断是否已经执行的定时任务。
aleung
aleung
2019-03-05 16:07:38 +08:00
@bzzhou 思路跟我做的差不多。我们那个增加了失败重试,多实例分布式协调。
polythene
polythene
2019-03-05 16:16:36 +08:00
一个低数据量的定时任务系统,供 LZ 参考 :
http://blog.betacat.io/post/how-wecron-schedules/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/541092

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX