【问题标题】:One Delayed_job per email vs. delayed_job for all emails?每封电子邮件一个 Delayed_job 与所有电子邮件的延迟工作?
【发布时间】:2014-02-12 06:03:22
【问题描述】:

作为我的应用程序的一部分,我每天都会向许多用户发送一封电子邮件。根据他们的状态,他们将收到五种可能类型的电子邮件之一。

确定用户收到哪封电子邮件的逻辑相当长。

我应该:

1) 我应该为每封电子邮件创建一个延迟作业

2) 使用发送命令将整个逻辑(50 行 Ruby)发送到单个作业中

这两种方法的优缺点是什么?

【问题讨论】:

    标签: ruby-on-rails delayed-job sendgrid


    【解决方案1】:

    除了 Sabyasachi Ghosh 的回答,这里是 DelayedJob and Resque 之间的区别:

    DelayedJob 依赖于数据库

    • 需要 ActiveRecord
    • 使用 Ruby 对象(不仅仅是引用)
    • 具有更深层次的队列功能(队列深度等)
    • 运行比 resque 重得多

    Resque 依赖于Redis

    • 轻量级
    • 独立于 ActiveRecord 运行
    • 旨在处理引用(不是整个对象)


    模块化

    在回答您的问题时,我会看看 模块化

    Rails' 基于DRY 代码的原则——这实质上意味着您需要尽可能地模块化(尽可能重用代码)。这会提高效率并简化开发周期

    鉴于此,您必须从模块化的角度来观察您的排队功能。 排队系统实际上是做什么的?


    它会排队

    因此,您希望在排队系统中包含尽可能少的代码

    我会创建一个redis实例(你可以得到它们on Heroku),并使用resque来排队特定的信息(例如idemail

    这将允许您使用 resque 运行 Redis 列表,发送尽可能多的电子邮件

    【讨论】:

    • 问题是自定义电子邮件中发送的数据必须在发送电子邮件之前的稍后日期(时间触发)获取。在这种情况下,有什么方法可以让队列保持轻量级吗?我想不出一种方法,数据收集(数据库访问)和发送电子邮件不会全部发生在一个工作中,因为不可能在不同工作之间进行通信。
    【解决方案2】:

    如果你有一个巨大的逻辑,如果你需要发送一堆电子邮件,我建议不要把延迟的工作放进去。最好使用 resque(https://github.com/resque/resque) 或 sidekiq(http://sidekiq.org/)。在发送电子邮件时,延迟作业会锁定您的数据库,因此您的性能会很低。 如果您的逻辑小且电子邮件数量较少,请为每封电子邮件延迟工作。因为它易于设置和实施。

    【讨论】:

    • delayed_job 真的会锁定数据库吗?如果我不从延迟的作业中调用数据库怎么办,它还会锁定它吗?
    • 如果您安装了延迟作业 gem,它将创建一个用于存储和处理数据的表。检查文档。
    【解决方案3】:

    我认为您需要通过延迟作业发送每封电子邮件,因为如果您的延迟作业发生任何事情,例如您的延迟作业在这种情况下崩溃或停止,那么系统将重新执行您的作业时可能会导致问题,所以我建议您在延迟作业中添加每封电子邮件。

    【讨论】:

    • 确实,我有代码可以在每次发送电子邮件时标记数据库,这样如果作业失败,它就不会重新发送给用户。但是,如果仅将电子邮件放入队列,则唯一的恢复选项是重新运行作业……这将超出 Rails 的控制范围。
    • 延迟作业确保您的所有作业都已成功处理,因此在这两种情况下重新运行都是解决方案,因此如果您想将其放在一个 rails 代码中,您可以这样做,我的观点是始终尽量避免延迟作业中的 Rails ActiveRecord 执行
    • 延迟作业的主要目的是处理耗时的进程。
    • 艾哈迈德,为什么来自 Delayed_job 的 AR 呼叫不是一个好主意?可能有太多工作人员对数据库的调用过多?
    • 在任何情况下,即使是延迟作业,您也必须执行应用数据库调用。我的观点是延迟作业的基本目的是在后台执行耗时任务延迟作业不做任何特别的事情,所以只尝试给它时间处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2015-08-19
    相关资源
    最近更新 更多