Retrasar el envío de un correo electrónico utilizando Mandrill send_at o Celery Countdown / eta

Por lo general, envío correos electrónicos transaccionales en respuesta a ciertas acciones en mi sitio web, algunas de las cuales demoro el envío por un par de horas. La función que realmente pone en cola el correo electrónico es una función de tarea de apio llamada con .delay() que eventualmente realiza una llamada de API a Mandrill utilizando djrill .

Descubrí que Mandrill ofrece un parámetro send_at cuando se envía un correo electrónico que Mandrill retrasará el envío del correo electrónico hasta la hora especificada. Celery también ofrece parámetros eta o countdown al llamar a apply_async() o delay() en una tarea, lo que hará que el trabajador de Celery espere X cantidad de tiempo antes de ejecutar la tarea, lo que aquí equivaldría a la misma cosa.

Ignorando el costo, ¿qué enfoque es preferible desde el punto de vista arquitectónico: hacer que Celery retrase la puesta en cola del correo electrónico con la countdown o enviar el correo electrónico a Mandrill de inmediato pero con un parámetro send_at para que Mandrill me espere? ¿Qué factores debo tener en cuenta al tomar esta decisión?

Compartiré algunos puntos que podríamos tener en cuenta para hacer una elección aquí:

  1. Tolerancia a fallos : si le damos esta responsabilidad a Celery, podríamos ser más propensos a fallar, ya que si la cola de mensajes (Rabbitmq, ZeroMQ o lo que sea), la máquina o el Celery fallan, el correo electrónico nunca se enviará. El mandril también podría fallar, pero probablemente en un grado menor.

  2. Mantenimiento : ¿Qué pasa si necesitas cambiar el apio por otra cosa? En este caso, debe migrar el código y, probablemente, dedicar algo de tiempo a averiguar cómo realizar esta progtwigción en la nueva herramienta MQ.

  3. OOP : desde el punto de vista de OPP, podríamos ver a Mandrill como una entidad que envía correos electrónicos, lo que trae varias funciones, por ejemplo, progtwigción, así que consummos este servicio externo de nuestro sistema, ¡déjelo hacer su trabajo!

  4. Capacidad de uso y escalabilidad : piense en una situación hipotética en la que necesita ejecutar su sistema en más de un servidor simultáneamente, debido a los crecientes requisitos de rendimiento; ¿Cuál es la manera más fácil y eficiente de manejar esta progtwigción?

Estos no son todos los aspectos que deben considerarse para tomar una decisión, pero ciertamente hay algunos que no deben pasarse por alto. Espero que ayude a encontrar una solución mejor / sólida.