异步架构的设计困惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LiJavaT
V2EX    Java

异步架构的设计困惑

  •  
  •   LiJavaT 130 天前 2916 次点击
    这是一个创建于 130 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    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
       128 天前
    @laminux29 好的老哥,我也调整一下日志记录的结构
        6
    RadishWind  
       128 天前
    我之前在 tiktok 就是做这个的 大业务线/私有改动需求多多给重新部署 小业务线内部标记
    RadishWind
    micean
        7
    micean  
       128 天前
    看描述像是需要一个工作流来处理任务
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     865 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:08 PVG 05:08 LAX 14:08 JFK 17:08
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86