task 切分和汇总 在 cloud 环境中如何设计?

2021-09-02 13:56:06 +08:00
 v2byy

有一个需求,一个 task 会生成多个子 task,这些 task 可以并行的跑,最后需要汇总。

业务是跑在 K8S 上的,也就是说是不同 pod 会去跑子 task,最后等所有子 task 都结束之后,汇总最终的数据。

这样的需求,不知道大家有什么想法可以建议一下呢?

目前想到的是 dispatch task 用 message queue,利用 redis 来做类似引用计数的效果,生成子 task 的时候计数加 1,完成一个子 task,计数减 1,计数为 0 的时候,进行数据汇总。

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

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

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

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

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

© 2021 V2EX