2009-03-18 8 views
6

Tengo una aplicación que comprueba cada minuto la base de datos de los correos que se deben enviar en ese momento. Estaba pensando en hacer de esto una tarea de rake que sería ejecutada por un trabajo cron cada minuto. ¿Habría una mejor solución para esto?Solución de los mejores rieles para un programa de correo que se ejecuta cada minuto

Por lo que he leído, esto no es ideal porque el rastrillo tiene que cargar todo el entorno de rieles cada minuto y esto se vuelve costoso.

¿Pensamientos?

Gracias.

Respuesta

11
  1. Puede usar backgroundrb. Esto, sin embargo, consumirá la memoria de la aplicación principal de Rails, ya que generará una instancia de Ruby exclusiva para backgroundrb.
  2. También puede definir un SystemController (o equivalente) en su aplicación principal, con varias acciones correspondientes a las diversas tareas domésticas que su aplicación debe realizar. Puede "prod" desde crontab usando wget o curl, la ventaja es que comparte recursos con su aplicación principal. Dependiendo de cuán paranoico o usted, o cuán vulnerable a DOS (u otros tipos de ataques) exponga dicho controlador, posiblemente, al mundo exterior, puede optar por bloquear el acceso a la URL de este controlador desde direcciones distintas al loopback (idealmente en el proxy inverso, alternativamente desde el propio controlador.)
0

hago lo que sugiere Vlad (# 2), con sólo las solicitudes locales honrado, y yo soy bastante paranoico requieren también una cadena de consulta específica viraron a la url.

Tengo varias acciones periódicas configuradas de esta manera.

1

Un método muy simple sería tener un script que hace ..

while true do 
    check_and_send_messages() 
    sleep 60 
end 

..which significa que no están en constante reaparición del entorno de Rails.

Obviamente, tiene varios defectos, pero también tiene algunos beneficios (por ejemplo, con su 1-Rake por minuto, que la tarea Rake toma más de un minuto, Rastrillo va a correr varias veces a la vez)

Además, los episodios Railscasts Rake in Background, Starling and Workling y Custom Daemon podría darle algunas ideas (que están describiendo exactamente esta tarea)

1

resulta que en realidad hay algo construido sólo para esto: ar_mailer. ar_mailer pone en cola los correos electrónicos en el DB y luego los envía periódicamente usando el comando ar_mailer. Puedes llamar a ar_mailer cada minuto.

Lo bueno de ar_mailer es que básicamente requiere muy pocos cambios en cuanto a la forma en que usted ya envía correos electrónicos. Solo necesita heredar de ar_mailer en lugar de ActiveMailer. Con este método, no tendrá que preocuparse por ejecutar tareas de rake en segundo plano, realizar procesos de bifurcación ni nada de eso, y de hecho obtendrá un servidor de correo real con mensajes en cola que se eliminan cuando el correo se envía realmente. Esta característica es importante si tiene un sistema que envía grandes cantidades de enmases de correo electrónico. He usado ar_mailer para construir una red social, para poder dar fe de su robustez.

Here's a good article that talks about ar_mailer in depth. Recomiendo encarecidamente no rodar su propia solución aquí ya que Eric ha desarrollado una solución probada a este mismo problema.

Cuestiones relacionadas