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

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

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

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

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

13 回复

能支持 2 个点就稳妥了:
1 要标记好处理和未处理, 这样就能断点续传, 坏了还能接着整
2 要支持重入, 也就是就算把 1 点中的所有标记重置为未处理, 系统可以重新跑一遍, 但是也不会有额外的副作用


感谢大佬的提醒,断点续传这个没考虑,要加进去,像你 2 中说的,感觉像这种 while(job = jobs.shift()) run(job) “系统”了

嗯… while(true) 这种循坏 还不够, 可以升级成
go woker(job_channel)
go woker(job_channel)
go woker(job_channel)
go woker(job_channel)

waitgroup.Wait()

看来还是单独弄个合成视频的应用部署比较靠谱😂

脚本执行没错
主要是看你的状态传递是什么需求,是否可以延迟获取状态

就是传递进度,还有最后成功、失败这些,状态传递给前端通过 websocket 或者轮询几下

你这个合成视频就是一个任务,你把任务存到数据库,然后服务启动的时候轮询这些任务,将未完成的任务继续跑不就行么,我理解的不知道对不对

问下哈, 处理视频合成 的任务, 一般都比比较 耗费内存吧 , 你的这个任务会不会 超出内存限制然后被杀掉 ?

大佬说的对啊,感觉这种方式要简单些,高👍

多谢提醒,我需要去摸索摸索,不过 ffmpeg 应该有限制资源使用的参数😂

写一个新的服务,扫描数据库,或者队列找没有完成的任务,或者新的任务,失败了在重试,完成之后标记下状态。
http 接收到任务之后就写到数据库,或者队列里面。

就这样搞了

在设计Node.js中的异步任务时,通常会使用JavaScript的Promise、async/await,或者Node.js原生的回调机制。下面是一个基于Promise和async/await的示例,展示如何设计一个异步任务。

假设我们需要执行一个异步的文件读取任务,我们可以这样设计:

const fs = require('fs').promises;

// 定义一个异步函数来读取文件
async function readFileAsync(filePath) {
  try {
    const data = await fs.readFile(filePath, 'utf8');
    console.log('File read successfully:', data);
  } catch (error) {
    console.error('Error reading file:', error);
  }
}

// 调用异步函数,并传入文件路径
const filePath = './example.txt';
readFileAsync(filePath);

在这个例子中,fs.promises.readFile是一个返回Promise的函数,我们使用await关键字等待其完成。如果文件读取成功,data变量将包含文件内容;如果失败,catch块将捕获并处理错误。

如果你更喜欢使用传统的Promise链式调用,可以这样写:

fs.readFile(filePath, 'utf8')
  .then(data => {
    console.log('File read successfully:', data);
  })
  .catch(error => {
    console.error('Error reading file:', error);
  });

这两种方式都可以有效地处理异步任务,选择哪种方式主要取决于你的代码风格和团队规范。在复杂的异步操作中,async/await通常会使代码更易于理解和维护。

回到顶部