3

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

谢谢

4

1 回答 1

4

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

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

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

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

于 2014-01-17T18:23:00.043 回答