2016-09-24 61 views
1

我有一個將文檔插入到mongo集合中的api。根據插入文檔的時間,我需要在插入時間後24小時發送電子郵件,並在插入時間後48小時發送短信。我打算使用_id來查找插入時間。在mongo中插入文檔後根據條件發送電子郵件

我的問題是,解決這個問題的最好方法是什麼?我想到的一個解決方案是讓腳本每分鐘運行一次,查找24小時和48小時前創建的文檔。

我覺得這可能是一個矯枉過正的問題,因爲我一直在查詢數據庫,有沒有更好的解決方案或使用mongo來達到這個目的從根本上說錯了?

回答

0

如果腳本失敗了一個小時,您將不會發送您應該在60分鐘內發送的郵件。您應該爲郵件保留一個標籤以便容錯。

這可能是一個更好的主意:在每個文檔中,都有名爲isMailSent24isMailSent48的字段。當你插入時,你總會插入'isMailSent24': false和​​。因爲郵件還沒有被髮送到這些文件,顯然。

每一分鐘你的腳本運行,它應該遵循:

  1. 'isMailSent24': falsenow - creationTime > 24 hours查找文件。

這將返回我們在24小時內尚未發送郵件的文檔,並且在其創建後超過24小時已過。這意味着是時候爲他們發送郵件了。大多數情況下,now - creationTime將是24小時1分鐘,因爲腳本每分鐘運行一次。但是,如果您的腳本在30分鐘內失敗,它仍會發送30分鐘前24小時創建的文檔的郵件。這是容錯和一些更好的做法

  1. 發送這些文件的郵件。
  2. 將它們修改爲'isMailSent24': true

並且'isMailSent48'也是相同的程序。

0

那麼爲此,您可以維護TTL索引25小時的另一個集合。

當您將一個條目放入主集合中時,將一個相應的文檔插入到具有TTL索引爲25小時的日期字段的新集合中。

現在每隔15分鐘運行一次調度程序,並簽出24小時前創建的所有文檔,驗證郵件沒有發送給該文檔並嘗試發送郵件,一旦您能夠發送郵件,更新記錄您已發送郵件並使用TTL索引更新日期字段。現在在24之後,我們再次發送短信,但是這次不更新日期字段,因此當目的被填滿時,文檔將被自己刪除。

它的好處是,你的主要收集將是免費的每分鐘大量查詢調用和後續更新。第二個好處是在發送郵件和短信之後,文件本身將被刪除,因此不用擔心清除它。

現在有一些我不得不提的備份,一個是因爲你從每分鐘改變到15分鐘會有一個滯後,它不會準確的24小時,我認爲在郵件和短信的情況下這些滯後可以接受的。或者您可以將頻率更改爲5分鐘。其他的事情是我沒有想到失敗的情況下,如果郵件發送不成功,也許你可以再次拿起,但無論如何你應該用TTL更新日期字段,否則在發送短信之前文件將被刪除24小時後。

相關問題