使用 Mandrill send_at 或 Celery countdown/eta 延迟发送电子邮件
Posted
技术标签:
【中文标题】使用 Mandrill send_at 或 Celery countdown/eta 延迟发送电子邮件【英文标题】:Delay sending an email using Mandrill send_at or Celery countdown/eta 【发布时间】:2015-09-24 09:52:38 【问题描述】:我通常会发送交易电子邮件以响应我网站上的某些操作,其中一些操作会延迟几个小时发送。实际对电子邮件进行排队的函数是一个用.delay()
调用的 Celery 任务函数,它最终使用djrill
对 Mandrill 进行 API 调用。
我发现 Mandrill 在发送电子邮件时提供了send_at
参数,这会使 Mandrill 延迟发送电子邮件直到指定时间。当在任务上调用 apply_async()
or delay()
时,Celery 还提供 eta
或 countdown
参数,这将使 Celery 工作人员在执行任务之前等待 X 时间——在这里,这相当于同一件事。
忽略成本,哪种方法在架构上更可取——让 Celery 延迟使用 countdown
对电子邮件进行排队,或者立即将电子邮件发送到 Mandrill 但使用 send_at
参数以便 Mandrill 等待我?做出此决定时应考虑哪些因素?
【问题讨论】:
您实际上是在问,您应该将预定的电子邮件保留在自己的队列中还是 Mandrill 的队列中?这几乎是一个操作问题:您是否更愿意将邮件队列维护卸载到 Mandrill,或者将其与您(可能)已经用于其他事情的 Celery 系统集成在一起。看来转换成本不会很高,所以不妨尝试两种方式,看看你喜欢哪一种。 另一件事:如果出于某种原因您需要在 调度 消息时分配 Mandrill 消息 ID,那么您必须使用 Mandrill 的 send_at . 我都做了;你完全正确,转换成本很低。在考虑这个问题时,我更想知道我在想什么——这听起来可能并不多。 【参考方案1】:我将分享一些我们在此处做出选择时可能需要考虑的要点:
容错:如果我们将此责任交给 Celery,那么我们可能更容易失败,因为如果消息队列(Rabbitmq、ZeroMQ 或其他)、机器或芹菜本身失败,那么电子邮件将永远不会发送。 Mandrill 也可能失败,但可能是次等。
维护:如果您需要将 Celery 换成别的东西怎么办?在这种情况下,您需要迁移代码,并且可能需要花费一些时间来弄清楚如何在新的 MQ 工具中进行这种调度。
OOP:从 OPP 的角度来看,我们可能会将 Mandrill 视为一个发送电子邮件的实体,它带来了几个功能,例如调度,所以让我们从我们的系统中使用这个外部服务,让它完成它的工作!
可用性和可扩展性:考虑一种假设情况,即由于性能要求不断提高,您需要同时在多台服务器上运行系统;哪种方式更容易、更有效地处理这种调度?
这些并不是做出决定时应该考虑的所有方面,但肯定是一些不容错过的方面。希望这有助于找到更好/更可靠的解决方案。
【讨论】:
以上是关于使用 Mandrill send_at 或 Celery countdown/eta 延迟发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Mailchimp 和/或 Mandrill 从电子邮件标题中删除 *|MC_PREVIEW_TEXT|*
尝试从 Mandrill 发送电子邮件时出现 html 或车把编码问题