首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于php脚本的作业订单调度cron作业的更好方法

基于php脚本的作业订单调度cron作业的更好方法
EN

Stack Overflow用户
提问于 2021-06-21 21:11:36
回答 3查看 921关注 0票数 3

所以我用NodeJS编写了简单的视频创建者脚本。

它在按预定的任务运行。

我有一个面板用PHP编写,用户输入详细信息并点击“提交新视频作业”按钮。这个新的工作是保存到DB与详细信息,jobId和status=“等待”数据。

PHP负责一次返回1状态,检查限制查询到1,然后在询问时使用jobID返回数据。

视频创建脚本每x秒请求该API请求新作业是可用的。

它有5项任务。

available=true。

  1. 检查新作业订单是否可用(每20秒有GET请求),如果有新作业;available=false
  2. 获取详细信息(姓名、图片网址等)
  3. 创建包含详细信息的视频。
  4. 将视频上传到FTP
  5. 将数据发布到API以更新详细信息。把这份工作标为“完成了”

available=true;

这些任务是异步的,所以每个任务都必须等待先前的任务才能完成。

现在,如果每20秒就有新的作业可用(时间还没有成熟),那么获取或发布请求api对我来说是不好的。。

那么,有任何方式/包/系统来完成此行为吗?

代码示例:

代码语言:javascript
复制
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();

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-12 19:03:09

虽然可以将数据库用作队列,但它通常被称为反模式(除了使用数据库进行日志记录之外),而且您需要:

那么,有任何方式/包/系统来完成此行为吗?

我使用免费形式的你的问题,感谢被安置的赏金建议:豆茎

豆茎是一个简单、快速的工作队列。 它的接口是通用的,但最初的设计是通过异步运行耗时的任务来减少大容量web应用程序中页面视图的延迟。

它有您在问题中提到的语言(以及更多的语言)的客户端库,易于在生产中使用和运行。

票数 1
EN

Stack Overflow用户

发布于 2021-07-15 12:49:31

RabbitMQ也是一个很好的排队系统。

为什么?

它确实有很好的文档(包括javascript &php在内的许多语言的例子)。

教程在公开实际用例时很简单。

它有一个REST。

它附带了一个监视UI。

如何使用它来解决您的问题?

在作业生成器端:通过遵循教程1将消息(作业)发送到队列

若要使用nodejs过程来使用作业,请参见RabbitMQ的教程2

其他建议:

使用预取值1,publisher确认,这样您就可以确保当作业运行时,使用者的实例不会接收消息。

快速原型路线图:教程1.然后是教程2x)。在发送和接收消息之后,您可以探索可以在队列和消息上设置的选项。

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

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

票数 2
EN

Stack Overflow用户

发布于 2021-07-12 18:43:58

在一个非常标准的系统设计范例中,使用Apache或任何基于队列的实现(例如,RabbitMQ)所做的工作。您可以查看一下Kafka/rabbitmq,但基本上没有详细说明:

  1. 有一个中央队列。
  2. 当用户提交作业时,作业将被添加到队列中。
  3. 视频处理器无限期地运行订阅队列。

您可以继续查找:https://www.gentlydownthe.stream/和您将认识到您正在做的事情的相似之处。

在这里,您不需要自己poll,您需要订阅一个事件,其他事情将由相应的队列管理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68074764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档