簡體   English   中英

Node.js / Koa2服務器-在請求后幾分鍾執行作業

[英]Node.js/Koa2 server - execute a job minutes after request

我有一個Koa2 / Node.js應用程序(使用async/await ),我想在請求后X分鍾執行作業,其中X是20至100之間的隨機分鍾數(我想用它來發送自動歡迎信息)給注冊用戶的電子郵件,並使其看起來像是我親自發送的)。

所以我可以只使用setTimeout來做到這一點,將計時器設置為200分鍾是否合理? 當然,如果我的應用程序崩潰了,也不會發送電子郵件,但是我會跟蹤數據庫中的所有注冊,因此在極少數的崩潰情況下,我會自己發送電子郵件。

命令隊列,例如rabbitMQ或環繞Redis的包裝(使用pub / sub或SETEX )似乎對於此類簡單任務來說是一項開銷。

對於潛在的N個請求相對長時間超時確實感到有點不舒服,但Node.js的setTimout()實際上是圍繞一個包裝uv_timer在功能libuv其目的是在底層操作系統的通知機制來處理龐大的定時器量。

盡管如此,為了使事情盡可能簡單,我將使用一個很好的cron作業,並使用一些包裝器庫來隱藏確切的實現。 使用node-schedule之類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();

我希望您的電子郵件也包含隨機內容,因為在不同的注冊嘗試情況下,即使是單個用戶也可以收到多封郵件-因此這種延遲可能會變成令人討厭的體驗。

暫無
暫無

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

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