2011-04-14 176 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)可以处理突发流量和批量输出。 (披露:我为公司工作。)

相关问题