【问题标题】:Iterate before or inside a Resque task?在 Resque 任务之前或内部进行迭代?
【发布时间】:2014-02-07 03:55:11
【问题描述】:

我有 2 个模型:用户和组 每次用户加入组时,都会向该组的所有成员发送一封电子邮件。 我有一个负责在后台发送电子邮件的 Resque 工作人员。

问题如下: 我应该在 Resque 任务之前还是内部进行迭代?

Example 1 (before):

# inside controller action
@group = Group.find(params[:group_id])
@group.users.each do |user|
    Resque.enqueue(EmailSender, {:user_id => user.id})
end

# inside worker
class EmailSender
  @queue = :emails_queue
  def self.perform(args = {})
    user = User.find(args['user_id'])
    Sender.send('new_member', {:user => user}).deliver
  end
end

或者

Example 2 (inside):

# inside controller action
@group = Group.find(params[:group_id])
Resque.enqueue(EmailSender, {:group_id => @group.id})

# inside worker
class EmailSender
  @queue = :emails_queue
  def self.perform(args = {})
    group = Group.find(args['group_id'])
    group.users.each do |user|
        Sender.send('new_member', {:user => user}).deliver
    end
  end
end

我应该选择示例 1 还是示例 2?

谢谢

【问题讨论】:

  • 如果你拯救了整个迭代,如果其中一个迭代失败,它可能会停止整个电子邮件发送过程。那是你要的吗?也许您宁愿只挽救失败的迭代并仍然发送其他邮件
  • 很有意义。感谢您的帮助

标签: ruby-on-rails ruby resque queuing


【解决方案1】:

您应该使用示例 1(之前),原因如下:

  1. 调试更容易,因为您可以在一个位置查看所有重要逻辑。示例 2 将一个重要功能(向组的所有成员发送电子邮件)分成两个不同的位置。

  2. 更灵活。假设您想在不同的上下文中发送相似(或相同)的电子邮件?这样,您可以使用相同的 Resque 类而不是创建一个新的类。

  3. (正如另一位评论者指出的)如果您的 Resque 类中发生错误,它将重试。您可能希望它只重试一封电子邮件,而不是整个批次。因此,Resque 作业应该只负责发送一封电子邮件。

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2020-12-15
    • 2018-05-06
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多