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

异步架构的设计困惑

  •  
  •   LiJavaT · 3 天前 · 1827 次点击

    背景:这个功能是一个快手广告批量搭建的一个功能里面涉及的流程就是点击运行搭建,上传视频素材,然后到轮训广告素材是否在快手广告素材库转吗并且审核通过,轮询完全部的素材之后,走搭建广告的逻辑。

    我现在具体实现就是,用户点击运行,会先发送消息到一个分发的消息队列里,这个分发的消息队列用分发这个需要上传素材,然后发送消息到上传素材队列,这个上传素材队列的消费者是集群模式,上传完成一个会调用回掉队列,然后回掉队列监听到全部素材都完成,走轮询,然后轮询完成,发送消息搭建广告。

    这个是一个流程图: image.jpg

    困惑就是目前需要很多团队来使用功能,如何吧 mq 队列根据团队拆分,还有执行速度,以及服务器的划分,我这个方式是否合理,大家还有更好的方案吗

    7 条回复    2025-06-03 14:41:42 +08:00
    kkhaike
        1
    kkhaike  
       3 天前   ❤️ 1
    感觉引入一个分布式任务处理平台更加合适
    z1829909
        2
    z1829909  
       3 天前
    消息队列仅作为中间件, 实际的调度, 资源分配, 流量控制在应用层做.
    xuanbg
        3
    xuanbg  
       2 天前
    你这个做法叫做“消息驱动”。mq 只是用来勾连各功能模块实现联动的。
    laminux29
        4
    laminux29  
       2 天前
    你这个数据太分散,如果业务逻辑一直成功执行倒是没啥问题,不过一旦哪里出问题了,你要查询与排错就非常麻烦。

    我遇到这种跨多个子系统的复杂流程,喜欢先设计一个超大的表单式数据结构,把所有的状态、时间、各种细节日志信息,都写在一条数据的字段里,这样查询方便、排错也方便。拿你这业务举个例子:

    struct BuildAds
    {
    # BuildAds 数据区域
    uint64 id;
    uint64 用户 id;
    uint64 部门 id;
    uint64 批次 id;
    uint64 策略 id;
    datetime 创建时间;
    uint64 调试 id;
    uint64 调试链顺序级别 id;
    uint64 调试链同级内部 id;
    ...其他 BuildAds 数据字段...;
    #
    # 素材处理数据区域
    bool 是否需要处理素材;
    datetime 素材列表开始处理时间;
    datetime 素材列表处理超时终止时间;
    string 素材列表处理超时终止细节;
    datetime 素材列表处理错误时间;
    string 素材列表处理错误细节;
    List<struct 素材> 素材列表
    {
    string 素材 name;
    uint 素材 size;
    datetime 素材创建时间;
    uint 素材创建用户 id;
    datetime 素材开始上传时间;
    datetime 素材上传最后一次中断时间;
    datetime 素材上传最后一次续传开始时间;
    datetime 素材上传超时终止时间;
    string 素材上传超时终止细节;
    datetime 素材上传其他错误时间;
    string 素材上传错误细节;
    datetime 素材上传完毕时间;
    enum 素材上传状态; # 未开始上传、上传中、上传中断、续传中、超时终止、其他错误;
    string 素材文件路径;
    ...其他素材文件数据字段...;
    };
    #
    # 广告数据区域
    datetime 广告开始搭建时间;
    datetime 广告搭建终止时间;
    string 广告搭建终止细节;
    datetime 广告搭建错误时间;
    string 广告搭建错误细节;
    datetime 广告搭建成功结束时间;
    ...其他广告搭建数据字段...
    enum 当前业务状态; # 已创建、素材处理中、素材处理终止或错误、搭建广告中、广告搭建终止或错误
    }

    我之所以会这样设计,是因为以前我设计过一个更复杂的业务,一套分布式多媒体系统,文件被人为移动过,但不知道从哪移动到哪里。业务逻辑是,要在多媒体列表里,把这些被移动的缺失的多媒体文件,找出来并更新多媒体列表。首先要解析多媒体列表,解析可能失败;然后备份列表文件,备份可能失败,备份可能重名;接着轮询多媒体列表里的每一条媒体文件数据,去全盘寻找,核对 HASH ,以及去重处理;接着有些多媒体文件能找到,有些找不到,这些也要处理。这里面一大堆状态,只有这种把状态与错误信息集中起来的超大表单式数据结构,才能方便开发、查询与排错。不然一旦数据结构分布在各个子系统中,查询与排错就巨麻烦,开发与排错效率巨低。
    LiJavaT
        5
    LiJavaT  
    OP
       1 天前
    @laminux29 好的老哥,我也调整一下日志记录的结构
    RadishWind
        6
    RadishWind  
       1 天前
    我之前在 tiktok 就是做这个的 大业务线/私有改动需求多多给重新部署 小业务线内部标记
    micean
        7
    micean  
       1 天前
    看描述像是需要一个工作流来处理任务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2909 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:23 · PVG 08:23 · LAX 17:23 · JFK 20:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.