V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
v2byy
V2EX  ›  程序员

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

  •  
  •   v2byy · 2021-09-02 13:56:06 +08:00 · 1390 次点击
    这是一个创建于 1176 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    6 条回复    2021-09-02 18:10:38 +08:00
    2le
        1
    2le  
       2021-09-02 14:10:59 +08:00 via Android   ❤️ 1
    在我自己负责的项目中是把分布式任务的触发、执行、进度、结果统计等由任务调度微服务完成,目前实现了两种执行器 MQ 和 HTTP 。拿 MQ 来讲,发布任务后,子任务端定期发送 MQ 消息汇报任务状态就行,任务调度服务会消费这些消息,进行任务的统一管理。
    v2byy
        2
    v2byy  
    OP
       2021-09-02 14:25:42 +08:00
    @2le 那你的任务调度服务是单点的么?如果不是,那如何知道所有子 task 已经完成?
    Itoktsnhc
        3
    Itoktsnhc  
       2021-09-02 16:03:55 +08:00
    之前做过一个多层任务树状态跟踪系统,主要用在跟踪数据采集任务的状态。
    初步需求我觉得类引用计数的方式是没问题的,最简单每个父级任务作为一个 redis 内的 hashset,然后字典的 key 为生成子任务 id 什么的,如果任务状态只有两种,可以使用存在 /不存在来标记,对应的 hashset 内没有任何元素,代表外层任务结束了;如果还有一些元素 那么这些 item 就是没完成的。
    Itoktsnhc
        4
    Itoktsnhc  
       2021-09-02 16:07:22 +08:00   ❤️ 1
    @Itoktsnhc 当然最终随着需求的增加 比如每个任务有多个状态,任务树存在多级等.经历了 redis->sql server->内存数据库 最终使用类 actor 的 Orleans 框架实现 https://github.com/Itoktsnhc/JobTrackerX.Orleans
    summerLast
        5
    summerLast  
       2021-09-02 17:46:21 +08:00
    基于 mq
    记得要保证幂等性
    map=>工作队列模式
    reduce=>事件触发
    ljzxloaf
        6
    ljzxloaf  
       2021-09-02 18:10:38 +08:00
    用 mq 挺好的,自带进度管理,client 宕机恢复,自动 rebalance 。就是要把任务多倒腾几趟,多些资源开销。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:07 · PVG 04:07 · LAX 12:07 · JFK 15:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.