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

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

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

    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   ·   实用小工具   ·   915 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:58 · PVG 05:58 · LAX 13:58 · JFK 16:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.