簡體   English   中英

根據來自 php 腳本的作業訂單安排 cron 作業的更好方法

[英]Better way to schedule cron jobs based on job orders from php script

所以我在 NodeJS 中編寫了簡單的視頻創建者腳本。

它正在計划的 cron 作業上運行。

我有一個用 PHP 編寫的面板,用戶輸入詳細信息並單擊“提交新視頻作業”按鈕。 這個新作業正在將詳細信息、jobId 和 status="waiting"數據保存到數據庫中。

PHP API 負責一次返回1 個狀態,檢查status="waiting"將查詢限制為1,然后在詢問時返回帶有 jobID 的數據

視頻創建腳本每 x 秒向該 API 請求一次請求新作業可用。

它有5個任務。

可用=真。

  1. 檢查是否有新的工作訂單(每 20 秒使用一次 GET 請求) ,如果有新工作; 可用=假
  2. 獲取詳細信息(名稱、圖片網址等)
  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)。

教程在展示真實用例時很簡單。

它有一個 REST API。

它帶有一個監控用戶界面。


如何使用它來解決您的問題?

在作業生產者方面:按照教程 1將消息(作業)發送到隊列

要使用 nodejs 進程使用作業:請參閱 RabbitMQ 的教程 2


其他建議:

使用預取值 1 並發布者確認,這樣您就可以確保消費者實例在作業運行時不會收到消息。

快速原型的路線圖:教程 1...然后是教程 2 x)。 發送和接收消息后,您可以探索可以在隊列和消息上設置的選項

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

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

您在非常標准的系統設計范式中所做的事情,使用 Apache Kafka 或任何基於隊列的實現(例如,RabbitMQ)完成。 您可以查看 Kafka/rabbitmq 但基本上不詳細介紹:

  1. 有一個中央隊列。
  2. 當用戶提交作業時,作業被添加到隊列中。
  3. 視頻處理器無限期地運行訂閱隊列。

您可以繼續查找: https : //www.gentlydownthe.stream/ ,您將認識到您正在做的事情的相似之處。

在這里你不需要自己poll ,你需要訂閱一個事件,其他的事情將由各自的隊列管理。

雖然可以將數據庫用作隊列,但它通常被稱為反模式(僅次於使用數據庫進行日志記錄),正如您正在尋找的那樣:

那么任何方式/包/系統來完成這種行為?

由於放置了賞金,我使用了您的問題的自由形式來建議: Beanstalk

Beanstalk 是一個簡單、快速的工作隊列。

它的界面是通用的,但最初旨在通過異步運行耗時的任務來減少大容量 Web 應用程序中頁面查看的延遲。

它具有您在問題中提到的語言(以及更多)的客戶端庫,易於開發和在生產中運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM