javascript - 根据来自 php 脚本的作业订单安排 cron 作业的更好方法

标签 javascript php node.js cron scheduled-tasks

所以我在 NodeJS 中编写了简单的视频创建器脚本。

它正在按计划的 cron 作业运行。

我有一个用 PHP 编写的面板,用户输入详细信息并单击“提交新视频作业”按钮。 这个新工作正在将 详细信息、jobId 和 status="waiting" 数据保存到数据库。

PHP API 负责一次返回1 个状态,检查status="waiting" 将查询限制为1 然后返回数据询问时的 jobID

视频创建脚本每 x 秒向 API 请求一次新作业是否可用。

它有 5 个任务。

可用=真。

  1. 检查是否有新工作订单(每 20 秒发送一次 GET 请求),如果有新工作; 可用=假
  2. 获取详细信息(姓名、图片 url 等)
  3. 制作包含详细信息的视频。
  4. 将视频上传到 FTP
  5. 将数据发布到 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)。发送和接收消息后,您可以探索可以在队列和消息上设置的选项

Nodejs 包:http://www.squaremobius.net/amqp.node/

PHP 包:https://github.com/php-amqplib/php-amqplib

关于javascript - 根据来自 php 脚本的作业订单安排 cron 作业的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68074764/

相关文章:

node.js - 如何在 Cloud9 中连接 MongoDB?

javascript - 如何从 Javascript 客户端发送多个 Socket IO socket.handshake.query 值

javascript - 无法使用 chrome.app.window.get 获取 chrome.window 实例

php - Javascript 获取 PHP 脚本的进度

php - 为什么用 openssl_pkcs7_sign 签名的消息不能用 openssl_pkcs7_verify 验证?

php - 具有动态标题的 CJuiDialog

node.js - 从 NodeJS 服务器在同构的react-redux应用程序中设置存储的初始状态(我正在使用react-router)

javascript - Draft-js JSON 到 EditorState 不更新

javascript - 在 javascript/jquery 中构建多部分/表单数据请求

javascript - 在 $state.go 上禁用转换