有一个需求,一个 task 会生成多个子 task,这些 task 可以并行的跑,最后需要汇总。
业务是跑在 K8S 上的,也就是说是不同 pod 会去跑子 task,最后等所有子 task 都结束之后,汇总最终的数据。
这样的需求,不知道大家有什么想法可以建议一下呢?
目前想到的是 dispatch task 用 message queue,利用 redis 来做类似引用计数的效果,生成子 task 的时候计数加 1,完成一个子 task,计数减 1,计数为 0 的时候,进行数据汇总。
1
2le 2021-09-02 14:10:59 +08:00 via Android 1
在我自己负责的项目中是把分布式任务的触发、执行、进度、结果统计等由任务调度微服务完成,目前实现了两种执行器 MQ 和 HTTP 。拿 MQ 来讲,发布任务后,子任务端定期发送 MQ 消息汇报任务状态就行,任务调度服务会消费这些消息,进行任务的统一管理。
|
3
Itoktsnhc 2021-09-02 16:03:55 +08:00
之前做过一个多层任务树状态跟踪系统,主要用在跟踪数据采集任务的状态。
初步需求我觉得类引用计数的方式是没问题的,最简单每个父级任务作为一个 redis 内的 hashset,然后字典的 key 为生成子任务 id 什么的,如果任务状态只有两种,可以使用存在 /不存在来标记,对应的 hashset 内没有任何元素,代表外层任务结束了;如果还有一些元素 那么这些 item 就是没完成的。 |
4
Itoktsnhc 2021-09-02 16:07:22 +08:00 1
@Itoktsnhc 当然最终随着需求的增加 比如每个任务有多个状态,任务树存在多级等.经历了 redis->sql server->内存数据库 最终使用类 actor 的 Orleans 框架实现 https://github.com/Itoktsnhc/JobTrackerX.Orleans
|
5
summerLast 2021-09-02 17:46:21 +08:00
基于 mq
记得要保证幂等性 map=>工作队列模式 reduce=>事件触发 |
6
ljzxloaf 2021-09-02 18:10:38 +08:00
用 mq 挺好的,自带进度管理,client 宕机恢复,自动 rebalance 。就是要把任务多倒腾几趟,多些资源开销。
|