所以我在 NodeJS 中编写了简单的视频创建器脚本。
它正在按计划的 cron 作业运行。
我有一个用 PHP 编写的面板,用户输入详细信息并单击“提交新视频作业”按钮。 这个新工作正在将 详细信息、jobId 和 status="waiting" 数据保存到数据库。
PHP API 负责一次返回1 个状态,检查status="waiting" 将查询限制为1 然后返回数据询问时的 jobID
视频创建脚本每 x 秒向 API 请求一次新作业是否可用。
它有 5 个任务。
可用=真。
- 检查是否有新工作订单(每 20 秒发送一次 GET 请求),如果有新工作; 可用=假
- 获取详细信息(姓名、图片 url 等)
- 制作包含详细信息的视频。
- 将视频上传到 FTP
- 将数据发布到 API 以更新详细信息。并将这项工作标记为“完成”
可用=真;
这些任务是异步的,所以每个任务都必须等待上一个任务完成。
现在,如果每 20 秒有新工作可用,则获取或发布请求 api(时间无关紧要)对我来说似乎是不好的方式。
那么有什么方法/包/系统来完成这个行为吗?
代码示例:
const cron = require('node-cron');
let available=true;
var scheduler = cron.schedule(
'*/20 * * * * *',
() => {
if (available) {
makevideo();
}
},
{
scheduled: false,
timezone: 'Europe/Istanbul',
}
);
let makevideo = async () => {
available = false;
let {data} = await axios.get(
'https://api/checkJob'
);
if (data == 0) {
console.log('No Job');
available = true;
} else {
let jobid = data.id;
await createvideo();
await sendToFTP();
await axios.post('https://api/saveJob', {
id: jobid,
videoPath: 'somevideopath',
});
available = true;
}
};
scheduler.start();
最佳答案
RabbitMQ 也是一个很好的队列系统。
为什么?
它确实有很好的文档记录(许多语言的示例,包括 javascript 和 php)。
Tutorials在公开真实用例时很简单。
它有一个 REST API。
它附带一个监控 UI。
如何使用它来解决您的问题?
在作业生产者方面:通过以下方式将消息(作业)发送到队列 tutorial 1
要使用您的 nodejs 进程使用作业:请参阅 RabbitMQ 的 tutorial 2
其他建议:
使用预取值 1 和发布者确认,这样您就可以确保消费者实例不会在作业运行时接收消息。
快速原型(prototype)路线图:教程 1... 然后是教程 2 x)。发送和接收消息后,您可以探索可以在队列和消息上设置的选项
关于javascript - 根据来自 php 脚本的作业订单安排 cron 作业的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68074764/