後執行作業分鐘,我有(使用async/await
)一Koa2/Node.js的應用程序,我想以後的請求X分鐘執行作業,其中X是隨機分鐘數從20到100不等(我想用它發送自動歡迎電子郵件給註冊用戶,並使其看起來像是由我親自發送的)。的Node.js/Koa2服務器 - 要求
所以,我可以只使用setTimeout
來做到這一點,設置一個200分鐘的計時器是否合理?當然,如果我的應用程序崩潰,電子郵件將不會被髮送,但我會跟蹤數據庫中的所有註冊,所以在極少數情況下,我會自己發送電子郵件。
後執行作業分鐘,我有(使用async/await
)一Koa2/Node.js的應用程序,我想以後的請求X分鐘執行作業,其中X是隨機分鐘數從20到100不等(我想用它發送自動歡迎電子郵件給註冊用戶,並使其看起來像是由我親自發送的)。的Node.js/Koa2服務器 - 要求
所以,我可以只使用setTimeout
來做到這一點,設置一個200分鐘的計時器是否合理?當然,如果我的應用程序崩潰,電子郵件將不會被髮送,但我會跟蹤數據庫中的所有註冊,所以在極少數情況下,我會自己發送電子郵件。
命令隊列,例如RabbitMQ的或環繞Redis的(與發佈/訂閱或SETEX
)似乎是這樣的簡單任務的開銷。
超時與潛在的N個請求相對長時間做覺得有點不舒服,但Node.js的setTimout()
實際上是libuv
周圍uv_timer
功能的包裝物,設計了底層操作系統的通知機制來處理龐大的定時器量。
儘管如此,爲了讓事情儘可能簡單,我會使用一個很好的舊cron作業與一些隱藏確切實現的包裝庫。有了像node-schedule
這樣的東西,只需要幾行代碼即可完成。
const schedule = require('node-schedule');
const getRandomMsAmount = (from, to) => {
const minutes = Math.floor(Math.random() * to) + from;
return minutes * 60 * 1000;
};
const getDateAfterMs = (ms) => {
const nowTimestamp = Number(new Date());
return new Date(nowTimestamp + ms);
};
const dueDate = getDateAfterMs(getRandomMsAmount(20, 100));
const emailJob = schedule.scheduleJob(dueDate,() => {
// logging, updating database, etc.
});
如果出現在加工過程中出錯,參考的作業可以被取消:
emailJob.cancel();
我希望你的電子郵件包含隨機內容爲好,因爲即使單個用戶可以在不同的註冊的情況下獲得的多個消息嘗試 - 所以這個延遲可能會變成一個令人討厭的經歷。
爲什麼不使用SendGrid並創建模板,以便電子郵件進程實現自動化並且即時發送電子郵件。更好的用戶體驗,然後等待100分鐘才能使用您剛註冊的新網站。 – VtoCorleone
其實我使用SendGrid,電子郵件過程是自動的,我只是想自動化延遲。並使它看起來像它是由人發送的,而不是bot。 –
如果可以的話,一個時間工作會比setTimeout更好。 – VtoCorleone