2017-08-17 86 views
1

後執行作業分鐘,我有(使用async/await)一Koa2/Node.js的應用程序,我想以後的請求X分鐘執行作業,其中X是隨機分鐘數從20到100不等(我想用它發送自動歡迎電子郵件給註冊用戶,並使其看起來像是由我親自發送的)。的Node.js/Koa2服務器 - 要求

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

+0

爲什麼不使用SendGrid並創建模板,以便電子郵件進程實現自動化並且即時發送電子郵件。更好的用戶體驗,然後等待100分鐘才能使用您剛註冊的新網站。 – VtoCorleone

+0

其實我使用SendGrid,電子郵件過程是自動的,我只是想自動化延遲。並使它看起來像它是由人發送的,而不是bot。 –

+0

如果可以的話,一個時間工作會比setTimeout更好。 – VtoCorleone

回答

2

命令隊列,例如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(); 

我希望你的電子郵件包含隨機內容爲好,因爲即使單個用戶可以在不同的註冊的情況下獲得的多個消息嘗試 - 所以這個延遲可能會變成一個令人討厭的經歷。