[英]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個任務。
可用=真。
可用=真;
這些任務是異步的,因此每個任務都必須等待上一個任務完成。
現在,如果每 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();
為什么 ?
它確實有據可查(許多語言的示例,包括 javascript 和 php)。
教程在展示真實用例時很簡單。
它有一個 REST API。
它帶有一個監控用戶界面。
如何使用它來解決您的問題?
在作業生產者方面:按照教程 1將消息(作業)發送到隊列
要使用 nodejs 進程使用作業:請參閱 RabbitMQ 的教程 2
其他建議:
使用預取值 1 並發布者確認,這樣您就可以確保消費者實例在作業運行時不會收到消息。
快速原型的路線圖:教程 1...然后是教程 2 x)。 發送和接收消息后,您可以探索可以在隊列和消息上設置的選項
Nodejs 包: http ://www.squaremobius.net/amqp.node/
您在非常標准的系統設計范式中所做的事情,使用 Apache Kafka 或任何基於隊列的實現(例如,RabbitMQ)完成。 您可以查看 Kafka/rabbitmq 但基本上不詳細介紹:
您可以繼續查找: https : //www.gentlydownthe.stream/ ,您將認識到您正在做的事情的相似之處。
在這里你不需要自己poll
,你需要訂閱一個事件,其他的事情將由各自的隊列管理。
雖然可以將數據庫用作隊列,但它通常被稱為反模式(僅次於使用數據庫進行日志記錄),正如您正在尋找的那樣:
那么任何方式/包/系統來完成這種行為?
由於放置了賞金,我使用了您的問題的自由形式來建議: Beanstalk 。
Beanstalk 是一個簡單、快速的工作隊列。
它的界面是通用的,但最初旨在通過異步運行耗時的任務來減少大容量 Web 應用程序中頁面查看的延遲。
它具有您在問題中提到的語言(以及更多)的客戶端庫,易於開發和在生產中運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.