Использование Thread.new для отправки почты на рельсы - PullRequest
3 голосов
/ 25 марта 2009

Я отправляю электронные письма на свое приложение (ruby 1.8.7, rails 2.3.2), как это Thread.new{UserMailer.deliver_signup_notification(user)}

Поскольку в ruby ​​используются зеленые потоки, это дает преимущество в производительности, или я могу просто использовать UserMailer.deliver_signup_notification(user) ?

Спасибо

Ответы [ 4 ]

2 голосов
/ 27 марта 2009

Я использовал вашу точную стратегию, и наши приложения в настоящее время работают (но rails 2.2.2). Я внимательно следил за этим, и наша нагрузка была относительно низкой (в среднем менее 20 писем, отправляемых в день, с пиками около 150 в день).

Пока что мы не заметили никаких проблем, и это, похоже, позволило решить некоторые проблемы с производительностью, которые у нас возникали при использовании почтового сервера Google.

Если вам нужно что-то спешить, попробуйте, это работает для нас.

2 голосов
/ 25 марта 2009

В общем, использование зеленых потоков для асинхронного выполнения фоновых задач будет означать, что ваше приложение может ответить пользователю до отправки почты. Вы не беспокоитесь об использовании нескольких процессоров; вас интересует только выгрузка работы в фоновый процесс и возвращение веб-страницы как можно скорее.

И после изучения документации на Rails похоже, что delivery_signup_notification будет блокироваться достаточно долго, чтобы поставить почту в очередь (хотя я могу ошибаться). Поэтому использование потока здесь может сделать ваше приложение более отзывчивым в зависимости от того, как настроен ваш почтовик.

К сожалению, мне не ясно, что delivery_signup_notification обязательно поточно-ориентированный. Я хотел бы внимательно прочитать документацию, прежде чем полагаться на это.

Обратите внимание, что вы делаете предположения о времени жизни процесса Rails после обработки запроса. Многие Rails-приложения используют DRb (или аналогичный инструмент) для разгрузки этих фоновых задач в совершенно отдельный рабочий процесс. Самый простой способ сделать это довольно часто - см. Google для ряда популярных библиотек .

2 голосов
/ 26 марта 2009

Глобальная блокировка виртуальной машины по-прежнему почти наверняка будет применяться при отправке этого электронного письма, то есть без разницы.

Вы не должны запускать потоки в цикле запроса / ответа. Вы не должны запускать потоки вообще, если вы не можете наблюдать их от создания до присоединения, и даже тогда, это редко стоит того, что создает.

Rails не является поточно-ориентированным и не предназначен для выполнения действий вашего контроллера. Только после того, как Rails 2.3 только что отправил был поточно-ориентированным, и только если вы включили его в environment.rb с config.threadsafe!

Эта статья объясняет более подробно. Если вы хотите отправить сообщение асинхронно, используйте BackgroundRb или его аналог.

1 голос
/ 25 марта 2009

Насколько я знаю, они будут такими же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...