【发布时间】:2014-02-12 06:03:22
【问题描述】:
作为我的应用程序的一部分,我每天都会向许多用户发送一封电子邮件。根据他们的状态,他们将收到五种可能类型的电子邮件之一。
确定用户收到哪封电子邮件的逻辑相当长。
我应该:
1) 我应该为每封电子邮件创建一个延迟作业
或
2) 使用发送命令将整个逻辑(50 行 Ruby)发送到单个作业中
这两种方法的优缺点是什么?
【问题讨论】:
标签: ruby-on-rails delayed-job sendgrid
作为我的应用程序的一部分,我每天都会向许多用户发送一封电子邮件。根据他们的状态,他们将收到五种可能类型的电子邮件之一。
确定用户收到哪封电子邮件的逻辑相当长。
我应该:
1) 我应该为每封电子邮件创建一个延迟作业
或
2) 使用发送命令将整个逻辑(50 行 Ruby)发送到单个作业中
这两种方法的优缺点是什么?
【问题讨论】:
标签: ruby-on-rails delayed-job sendgrid
除了 Sabyasachi Ghosh 的回答,这里是 DelayedJob and Resque 之间的区别:
DelayedJob 依赖于数据库
模块化
在回答您的问题时,我会看看 模块化
Rails' 基于DRY 代码的原则——这实质上意味着您需要尽可能地模块化(尽可能重用代码)。这会提高效率并简化开发周期
鉴于此,您必须从模块化的角度来观察您的排队功能。 排队系统实际上是做什么的?
它会排队
因此,您希望在排队系统中包含尽可能少的代码
我会创建一个redis实例(你可以得到它们on Heroku),并使用resque来排队特定的信息(例如id或email)
这将允许您使用 resque 运行 Redis 列表,发送尽可能多的电子邮件
【讨论】:
如果你有一个巨大的逻辑,如果你需要发送一堆电子邮件,我建议不要把延迟的工作放进去。最好使用 resque(https://github.com/resque/resque) 或 sidekiq(http://sidekiq.org/)。在发送电子邮件时,延迟作业会锁定您的数据库,因此您的性能会很低。 如果您的逻辑小且电子邮件数量较少,请为每封电子邮件延迟工作。因为它易于设置和实施。
【讨论】:
我认为您需要通过延迟作业发送每封电子邮件,因为如果您的延迟作业发生任何事情,例如您的延迟作业在这种情况下崩溃或停止,那么系统将重新执行您的作业时可能会导致问题,所以我建议您在延迟作业中添加每封电子邮件。
【讨论】: