为提醒电子邮件构建系统

Posted

技术标签:

【中文标题】为提醒电子邮件构建系统【英文标题】:Architecting a system for reminder emails 【发布时间】:2015-11-12 05:19:08 【问题描述】:

我正在 Rails 4.2 中构建一个预订系统,我需要在预定义的时间间隔向用户发送一组电子邮件(例如,他们有即将到来的预订、完成后的反馈、更改/取消现有的链接预订等)。我环顾四周,发现 this 和 this,但我正在尝试在这两种方法之间做出决定。

我看到了构建这个系统的两种主要方法。

    使用像delayed_job 这样的队列系统。每当有人进行预订时,我们会将所有电子邮件排队等待发送的正确时间。

    专业版:所有电子邮件的一个队列。自动重试逻辑。

    骗局:数以千计的电子邮件最终会在系统中排队。每当有人取消预订时都需要出列(依赖:销毁与之相关的电子邮件可能很容易)。关于我们需要在什么时间发送电子邮件的逻辑有点复杂。

    cron + rake 以某个预定义的时间间隔运行的任务(每小时?每十五分钟一次?)并检查需要发送的电子邮件。它运行类似“查找所有三天后的预订”的查询,然后发送所有电子邮件。

    优点:将所有内容都放入应用程序逻辑中,减少我们需要跟踪的状态量。

    缺点:需要跟踪已发送的电子邮件,这在概念上类似于我们上面已经创建的任何作业表。

【问题讨论】:

我使用了第二种方法(因为我从未想过第一种方法:P),不知何故我觉得第二种方法更安全,更易于管理。依赖延迟的工作在某种程度上并不那么安全,因为工作流程可能会下降,并且像你提到的那样更复杂的逻辑。 【参考方案1】:

第二种方法更好(如果在heroku上使用heroku调度程序),队列更多的是“尽快运行”而不是“在这个特定的日期时间运行”

【讨论】:

【参考方案2】:

1)使用delayed_job(或Sidekiq)的一个很好的优势是您可以从站点动态更新作业(或重复作业)的时间表。

您可以在您的网站中提供一个页面来更新定期作业。现在,delayed_job 默认情况下实际上并不允许重复作业。通过delayed_job_recurring 或sidekiq-scheduler 可能会感兴趣的附加宝石。如果计算能力不是问题,我总是更喜欢实际的作业处理器而不是 cron,因为它对我来说更易于管理。

【讨论】:

以上是关于为提醒电子邮件构建系统的主要内容,如果未能解决你的问题,请参考以下文章

为SSH登录设置电子邮件提醒

监控系统资源加邮件提醒

构建电子通讯发送系统/避免垃圾邮件

安排从现在起 24 小时后发送电子邮件?

电子邮件系统帐户集成

根据进程名监控进程(邮件提醒)