2014-01-17 2 views
3

У меня есть 2 модели: Пользователь и группа Каждый раз, когда пользователь присоединяется к группе, электронное письмо отправляется всем членам этой группы. У меня есть работник Resque, который заботится о отправке писем в фоновом режиме.Итерация перед или внутри задачи 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?

Спасибо

+0

Если вы спасли всю итерацию, если одна из итераций завершилась неудачей, она, вероятно, остановит весь процесс отправки электронной почты. Это то, что вы хотите? Возможно, вам лучше спасти только неудачную итерацию и отправить другие письма. – MrYoshiji

+0

Делает большой смысл. Thx для помощи – lpdahito

ответ

4

Вы должны использовать Пример 1 (раньше) по следующим причинам:

  1. Это проще отлаживать, потому что вы можете видеть всю важную логику в одном месте. Пример 2 разделяет важную функцию (по электронной почте всех членов группы) на два отдельных места.

  2. Это более гибкий. Предположим, вы хотите отправить подобное (или то же) электронное письмо в другом контексте? Таким образом, вы можете использовать тот же класс Resque, а не создавать новый.

  3. (Как указал еще один комментатор) Если в вашем классе Resque произошла ошибка, он будет повторять попытку. Вы, вероятно, хотите, чтобы он только повторил одно письмо, а не всю партию. Таким образом, задача Resque должна отвечать только за отправку одного сообщения.

+0

Thx много для вашей помощи. Вы правы, это имеет смысл. – lpdahito

Смежные вопросы