在Resque任务之前或之内迭代?

时间:2014-01-17 17:38:52

标签: ruby-on-rails ruby resque queuing

我有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?

谢谢

1 个答案:

答案 0 :(得分:4)

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

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

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

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