簡體   English   中英

動態安排提醒 email 的最佳方法? 有什么比 cron 更好的嗎?

[英]Best way to dynamically schedule reminder email? Anything better than cron?

您好,我正在開發一個 web 應用程序。 其中一個將允許用戶安排“提醒”email 在一天中的特定時間發送給他們。 實現這一目標的最佳方法是什么? 基本上,當我想要的是“中斷”模式時,我提出的所有解決方案都以“輪詢”模式運行。

以下是我提出的一些可能的解決方案:

  1. 每分鍾都有一個 cronjob 觸發。 觸發的腳本檢查數據庫以查看是否有任何電子郵件要發送,如果有,它會發送它們,否則它會重新進入睡眠狀態。 這樣做的缺點是每分鍾都會產生一些開銷。 此外,這可能不是一個可擴展的系統,尤其是當用戶數量變得如此之多以至於發送所有電子郵件可能需要一分鍾多的時間時。

  2. 與 #1 相同,但作業僅每 15 分鍾觸發一次。 這更易於管理,但並不完美,因為它將用戶限制在 15 分鍾標記上進行提醒,並且在沒有電子郵件要發送時仍然會產生一些開銷。 不錯,但也不完美。

  3. 讓 PHP exec() 有一段代碼可以動態改變 crontab 或在底層 linux 中安排“at”作業。 這將為我提供我非常渴望的靈活性和“中斷”類型 model,但會在允許 PHP 執行() linux 代碼時打開一個巨大的安全漏洞。 所以,我要去 go 提前排除這個。

那么,有什么比我想出的更好嗎? 也許是一種不使用 cron 來安排 email 的方法? 我很想知道你們對此有什么看法:)。

您可以讓 PHP 腳本保持運行。 每個設置的時間間隔,查詢數據庫中需要在下一個時間間隔發送的電子郵件。 每分鍾將其分解為一組。 因此,如果您選擇 15 分鍾,您將擁有一個包含 15 個條目的數組,每個條目包含當時需要發送的所有電子郵件。

然后,您可以使用分叉來拆分進程,一個處理發送電子郵件,另一個休眠到下一分鍾並再次拆分。 為了擴展,您可以分叉多個進程,每個進程處理一定數量的電子郵件。

簡而言之,一個進程管理隊列並分叉其他進程來處理發送。 當隊列為“空”時,它會變得更多。 您可以定期運行一個 cron 以確保該進程沒有終止。

使用第一個變體。

發送所有電子郵件可能需要一分鍾多的時間

  1. 檢查,如果 file_exists('mailing.q'); 如果仍然存在 - 終止執行。
  2. 創建文件 mailing.q
  3. 發電子郵件
  4. 取消鏈接('mailing.q');

並且不要考慮開銷 - 在這種情況下不是。

在選項 #1 和 #2 中使用 cron 並沒有什么特別的錯誤,我不知道您使用的是哪種應用程序,但可能沒有必要讓用戶能夠安排到確切的分鍾。 即便如此,如果您的腳本將提醒狀態標記為“待處理”等,並且腳本的任何新實例僅發送非“待處理”或“已發送”的實例,這可能也不會成為問題。

您可以使用 Hudson 或類似的應用程序來幫助進行腳本管理,並使您能夠密切關注故障等。它甚至可以在出現故障時發出通知。 它支持它自己的基於 java 的 cron 系統。

如果應用程序確實變大了,您當然可能希望將此過程從您的 web 服務器卸載到單獨的服務器。 如果您還沒有使用外部 SMTP 服務,您可能還想查看用於發送郵件的 3rd 方工具,並查看他們可能擁有哪些集成工具。 這也應該提高交貨率等。

不要混淆排隊發送郵件和實際發送郵件。

您的郵件服務器可能需要15 分鍾來發送一個 email。 但是我的mail(1)只需要0.036s就可以將郵件消息排隊發送。

即使您最終每分鍾發送超過 1600 封電子郵件(干得好),您也可以稍微調整您的代碼,以便在幾分鍾前開始發送提醒電子郵件,以期待“峰值”——比如說,尋找提前五分鍾在您的數據庫中查看是否有超過 1000 封郵件要投遞,並開始以 1/5 概率、1/4 概率、1/3 概率、1/2 概率對它們進行排隊。 然后排隊剩余。

有一個命令hostman允許您在特定時間調用 function。 那應該做你想做的。


這是我最初的建議:

組合呢?

  1. 讓一個 cron 作業在 <timespan> 內運行一次。
  2. 讓它填充一個帶有時間戳 => 列表的文件,以反映 <當前時間> + <時間跨度> 之前是否存在 email。
  3. 每分鍾運行第二個 cron,如果在 email 列表文件中找到時間,則運行 email 發送腳本。

暫無
暫無

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

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