2011-09-28 3 views
6

tengo mi configuración del sistema de correo electrónico transaccional & por personas predeterminadas obtener mensajes de correo electrónico como eventos ocurren:¿Cuál es la forma más elegante de implementar un correo electrónico resumido sin reinventar un sistema de cola?

class Comment 

    after_create :email_original_poster 

    def email_original_poster 
    UserMailer.delay.notify_author_of_comment self 
    end 

end 

Sin embargo en lugar de obtener el correo electrónico que se produzca la, un trozo de mis usuarios preferiría un resumen diario o semanal .

¿Cuál es la forma más elegante y limpia de implementar esto?

ya tengo delayed_job funcionando pero esto realmente no se siente como un trabajo delayed_job ya que estoy haciendo cola los datos que necesita ser actuado en lugar de acciones que deben ser ejecutadas.

... sin reinventar un sistema de colas

sé que la solución obvia es la tabla de queued_emails y por supuesto que podría hacer eso. La razón por la que hago la pregunta es que hacerlo es reinventar un sistema de colas. No sólo hay un montón de cola sistemas por ahí, pero como este post bien redactado a partir Percona señala, es una buena idea de no rodar su propia:

http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

se han ejecutado un mensaje de resumen, que hizo use delayed_job & ¿Qué aprendió?

Respuesta

1

Obviamente, no debería tener que crear su propio sistema de colas. No he usado el método de trabajo retardado, pero he usado resque junto con una pequeña joya llamada resque_mailer que debería hacer exactamente lo que usted desea. Lo bueno de resque_mailer es que, una vez configurado, no tienes que cambiar la forma en que normalmente enviarías el correo: MyMailer.some_mailing({vars}).deliver Si por alguna razón no quieres utilizar la cola para enviar el correo (enviarlo de inmediato), solo necesitas agregar! después del parto y hará exactamente eso.

Mire en resque (con redis) y resque_mailer, creo que hará lo que quiera.

+1

Gracias por esto. Va a pasar un tiempo antes de que pueda revisarlo y descubrir cómo funciona, pero me aseguraré de volver a su respuesta una vez que tenga –

+0

Suena genial. Prácticamente todo lo que sé sobre Resque lo aprendí de este Railscast: http://railscasts.com/episodes/271-resque – Nate

1

Un resumen parece más apropiado para hacer como un trabajo de cron como. Todavía tendría que controlar a "a quién le envió", para hacer frente a bloqueos y errores, pero la idea es ejecutar, por ejemplo, a diario, una tarea de rake personalizada que cree su mensaje de correo incluyendo toda la información en un digerir formato y enviar o cola para enviar.

+0

Estoy de acuerdo en que este es el mecanismo desencadenante más sensato, pero aún no aborda el aspecto de la cola, que es que aún necesita poner en cola los correos electrónicos para ser procesados ​​por ese trabajo cron. Como dijiste, también debes asegurarte de que se procesen y lidiar con los que no son, por lo que el cron por sí solo no llega tan lejos. –

+0

si la cola es de su incumbencia, ¿ha intentado en lugar de retrayed_job (basado en datos relacionales), resque (basado en redis)? Recientemente hice algunas investigaciones sobre los puntos de referencia de Redis y se presentó como un monstruo más rápido.Realmente creo que no se puede hacer esto sin algún tipo de cola, y resque/redis parece ser una buena oportunidad ya que es una cola persistente y no completará su base de datos sql. –

+0

Estoy de acuerdo. Creo que este es el enfoque que probablemente sea el más apropiado: Nate sugirió un plugin basado en resque y diseñado para esta tarea, así que eso es lo primero que voy a probar –

Cuestiones relacionadas