2011-04-14 173 views
2

我在構建論壇的尾部/ Q &基於社區的應用程序,我想添加電子郵件通知。該應用程序有幾個不同的實體,包括線程,問題,項目,照片等。目標是用戶可以「訂閱」任意數量的這些實體,只要實體接收到新的評論或活動,就會排隊發送電子郵件。該功能與Facebook和論壇非常相似。通過RoR應用程序向用戶發送電子郵件

我查看了ActionMailer(包含rake任務和延遲作業),MailChimp API(和插件)以及其他應用程序郵件程序(PostageAppPostmark)。

由於內存耗費和服務器過載的潛在問題,我傾向於使用ActionMailer。該應用程序將在Heroku上運行,但恐怕服務器可能很容易被淹沒,每隔幾分鐘發送數百封電子郵件。

另一個複雜性是,根據用戶的喜好,會有不同類型的訂閱(即時電子郵件通知,每日電子郵件通知)。

什麼是最好的方式來管理這樣的功能的電子郵件?任何提示/想法,非常感謝!

回答

2

您可以使用ActionMailer使用SendGrid或Postmark進行發送。 PostageApp仍然需要一個SMTP服務器並添加額外的依賴項,但它可以很好。 MailChimp僅適用於我認爲的通訊,所以這可能對您沒有多大用處。

這裏給予高度概括,幾件事情很重要:

  1. 請郵件邏輯塞滿控制器。
  2. 防止延遲對用戶請求的響應。
  3. 避免出現「應用程序過載」的問題。
  4. 處理基於事件和定期的電子郵件。

要解決#1問題,您需要使用Observer來決定何時發送基於事件的電子郵件。爲了解決#2和#3,您可以放入DelayedJob,以便在後臺發送電子郵件。你可以很容易地在Heroku上使用帶有ActionMailer的SendGrid(特別是如果你放入Pony)。對於#4,你應該創建一個rake任務來處理決定發送電子郵件和排隊發送作業的業務邏輯,如同Observer那樣的DJ任務。

只需要明確,DelayedJob將在單獨的進程中執行作業。在Heroku的情況下,您實際上是在不同的Dyno中運行每個DelayedJob工作程序,這是一個完全獨立的堆棧/環境(很可能位於不同的物理服務器上)。你的應用程序不會有任何問題以這種方式超載,除非你的數據庫無法跟上添加作業(在這種情況下,你可以使用Redis作爲DJ商店)。根據需要添加更多DJ工作人員可以輕鬆地進行水平縮放。

0

看看SimpleWorker,一個基於雲的後臺處理/工作者隊列。

這是Heroku的附件,可以擴展和處理一組一次性帖子或計劃的電子郵件。 (例如,可以安排主任務,然後在計劃運行時將其排隊等待10s,100s和1000s作業,以跨越擴展基礎架構同時運行。)

Heroku工作人員可以正常工作,因爲他們將作爲單獨的進程運行,但如果您有可變負載,那麼您需要可以按比例增加和減少工作的服務 - 因此您a)不支付對於未使用的容量和b)可以處理突發流量和批量輸出。 (披露:我爲公司工作。)

相關問題