2012-08-28 4 views
1

У меня есть почта для отправки всем пользователям, которые отправляют по электронной почте один пользователь.Heroku/rails: ошибка 302 при отправке большого количества почты

Функция работает, но я получаю уродливое сообщение об ошибке в веб-приложении. На бревнах я получаю

2012-08-28T12:08:03+00:00 heroku[router]: Error H12 (Request timeout) -> POST afternoon-spring-6294.herokuapp.com/welcome/wall dyno=web.1 queue= wait= service=30000ms status=503 bytes=0 
[...] 
Sent mail to [email protected] (1708ms) 
2012-08-28T12:08:31+00:00 app[web.1]: Redirected to http://afternoon-spring-6294.herokuapp.com/ 
2012-08-28T12:08:31+00:00 app[web.1]: Completed 302 Found in 58114ms (ActiveRecord: 8.9ms) 

Есть ли обходной путь (он был инициирован только 33 электронными письмами)?

ответ

1

Heroku reaps all process that run longer than 30s, что означает, что почти любая периодическая электронная почта через нечто вроде mailgun или sendgrid будет убита с ошибкой H12.

Существует несколько основных способов обработки, но все они связаны с тем, чтобы сделать вещи более асинхронными. Heroku worker processes может работать неограниченно - или, по крайней мере, дольше 30 секунд.

Традиционный вариант заключается в использовании queue - delayed_job является мертвым простым и ему нужна только база данных, чтобы поддержать его. Resque также крут, но Redis нужно добавить в микс. Есть также МНОГО более сложных опций, но delayed_job прост. Railscasts, вероятно, ваш друг здесь, чтобы выяснить, как это сделать.

Другой вариант - использовать рабочий процесс для непосредственного решения задач электронной почты. Например, вы можете использовать работника для отправки электронной почты в партиях каждые X минут, используя задачу рейка. Это своего рода очередь без всех накладных расходов. Предположим, вам нужно отправить партию приглашений, вы пишете приглашения с неотправленным статусом в таблицу, затем выполните команду rake и выпустите ее, повторите до конца. Вы в основном переопределяете простую очередь, но можете чувствовать себя более комфортно.

Лично я бы поставил delayed_job, пока мне не понадобилось что-то более мощное.

+0

Хорошо спасибо! Я поставлю список дел! – piffy

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