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. すべての重要なロジックを 1 か所で確認できるため、デバッグが容易になります。例 2 では、重要な機能 (グループのすべてのメンバーにメールを送信する) を 2 つの別々の場所に分割しています。

  2. より柔軟です。似たような (または同じ) メールを別のコンテキストで送信したいとしますか? このようにして、新しい Resque クラスを作成するのではなく、同じ Resque クラスを使用できます。

  3. (別のコメンターが指摘したように) Resque クラスでエラーが発生した場合、再試行されます。おそらく、バッチ全体ではなく、単一の電子メールのみを再試行する必要があります。したがって、Resque ジョブは 1 つの電子メールの送信のみを担当する必要があります。

于 2014-01-17T18:23:00.043 に答える