大佬们帮我看看这个异步任务怎么设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noobma
V2EX    Node.js

大佬们帮我看看这个异步任务怎么设计

  •  
  •   noobma 2020-01-17 11:04:20 +08:00 7413 次点击
    这是一个创建于 2168 天前的主题,其中的信息可能已经有所发展或是发生改变。

    nodejs 项目,用 pm2 管理,有一个用户通过 http 接口上传图片合成视频的功能,我本来打算把合成视频的代码直接放在项目中当 service 异步执行,但是后来一想,如果正在合成视频的时候,应用重启,那这个任务的状态就丢了啊。

    现在想的是,把这个合成视频的代码弄到一个单独的文件中,当脚本执行,这个脚本自己往数据库中写状态。

    请各位大佬指点下这种场景比较通用的做法是什么,谢谢

    12 条回复    2020-01-17 18:26:44 +08:00
    shoaly
        1
    shoaly  
       2020-01-17 11:10:55 +08:00   1
    能支持 2 个点就稳妥了:
    1 要标记好处理和未处理, 这样就能断点续传, 坏了还能接着整
    2 要支持重入, 也就是就算把 1 点中的所有标记重置为未处理, 系统可以重新跑一遍, 但是也不会有额外的副作用
    noobma
        2
    noobma  
    OP
       2020-01-17 11:28:01 +08:00
    @shoaly 感谢大佬的提醒,断点续传这个没考虑,要加进去,像你 2 中说的,感觉像这种 `while(job = jobs.shift()) run(job)` “系统”了
    shoaly
        3
    shoaly  
       2020-01-17 11:44:12 +08:00   2
    嗯.... while(true) 这种循坏 还不够, 可以升级成
    go woker(job_channel)
    go woker(job_channel)
    go woker(job_channel)
    go woker(job_channel)

    waitgroup.Wait()
    noobma
        4
    noobma  
    OP
       2020-01-17 12:22:07 +08:00
    @shoaly 看来还是单独弄个合成视频的应用部署比较靠谱
    wangyzj
        5
    wangyzj  
       2020-01-17 12:52:05 +08:00   1
    脚本执行没错
    主要是看你的状态传递是什么需求,是否可以延迟获取状态
    noobma
        6
    noobma  
    OP
       2020-01-17 13:57:42 +08:00
    @wangyzj 就是传递进度,还有最后成功、失败这些,状态传递给前端通过 websocket 或者轮询几下
    ksice
        7
    ksice  
       2020-01-17 14:48:47 +08:00   1
    你这个合成视频就是一个任务,你把任务存到数据库,然后服务启动的时候轮询这些任务,将未完成的任务继续跑不就行么,我理解的不知道对不对
    flyingfz
        8
    flyingfz  
       2020-01-17 15:38:21 +08:00   1
    问下哈, 处理视频合成 的任务, 一般都比比较 耗费内存吧 , 你的这个任务会不会 超出内存限制然后被杀掉 ?
    noobma
        9
    noobma  
    OP
       2020-01-17 18:03:53 +08:00
    @ksice 大佬说的对啊,感觉这种方式要简单些,高
    noobma
        10
    noobma  
    OP
       2020-01-17 18:11:12 +08:00
    @flyingfz 多谢提醒,我需要去摸索摸索,不过 ffmpeg 应该有限制资源使用的参数
    wzwwzw
        11
    wzwwzw  
       2020-01-17 18:23:35 +08:00   1
    写一个新的服务,扫描数据库,或者队列找没有完成的任务,或者新的任务,失败了在重试,完成之后标记下状态。
    http 接收到任务之后就写到数据库,或者队列里面。
    noobma
        12
    noobma  
    OP
       2020-01-17 18:26:44 +08:00
    @wzwwzw 就这样搞了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2955 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:22 PVG 20:22 LAX 04:22 JFK 07:22
    Do have faith in what you're doing.
    ubao msn 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