Realmente no me gustan las gemas como delayed_job
y background_job
que persisten en una base de datos con el fin de ejecutar trabajos asincrónicos. Simplemente me parece sucio. Cosas transitorias no pertenecen a una base de datos.
Soy un gran admirador de las colas de mensajes para tratar tareas asincrónicas, incluso cuando no se necesita una escalabilidad masiva. Tal como lo veo, las colas de mensajes son la "lingua franca" ideal para sistemas complejos. Con una cola de mensajes, en la mayoría de los casos, no tiene restricciones sobre las tecnologías o los idiomas que están involucrados en lo que sea que esté construyendo.Los beneficios del uso de cola de mensajes de baja concurrencia es probablemente más notable en un entorno "empresarial" donde la integración siempre es un dolor masivo. Además, las colas de mensajes son ideales cuando su flujo de trabajo asincrónico implica múltiples pasos. RabbitMQ es mi favorito personal.
Por ejemplo, considere la situación en la que está la construcción de un motor de búsqueda. Las personas pueden enviar URI para indexar. Obviamente, no desea recuperar e indexar la página en solicitud. Así que construye alrededor de una cola de mensajes: el objetivo de envío de formularios toma el URI, lo arroja a la cola de mensajes para ser indexado. El siguiente proceso de araña disponible saca el URI de la cola, recupera la página, encuentra todos los enlaces, los vuelve a colocar en la cola si no se conocen y guarda el contenido en caché. Finalmente, se envía un nuevo mensaje a una segunda cola para que el proceso del indexador trate el contenido en caché. El proceso del indexador saca ese mensaje de la cola e indexa el contenido en caché. Muy simplificado, por supuesto, los motores de búsqueda son un montón de trabajo, pero entiendes la idea.
En cuanto a los demonios reales, obviamente, soy parcial de mi propia biblioteca (ChainGang), pero en realidad es solo una envoltura alrededor de Kernel.fork() que te da un lugar conveniente para manejar la configuración y el código de desmontaje. Tampoco está terminado todavía. La pieza del daemon es mucho menos importante que la cola de mensajes, en realidad.
En cuanto al entorno de Rails, bueno, eso es probablemente lo mejor deja como ejercicio para el lector, ya que el uso de memoria va a ser un factor significativo lo que con el proceso de larga duración. No quiere cargar nada que no tenga que hacer. A propósito, esta es un área en la que DataMapper patea el trasero de ActiveRecord. La inicialización del entorno está bien documentada, y hay muchas menos dependencias que entran en juego, lo que hace que todo el kit y el caboodle sean significativamente más realistas.
Lo único que no me gusta de cron + rake es que virtualmente se garantiza que rake imprime en salida estándar, y cron tiende a ser excesivamente hablador si tus trabajos cron producen resultados. Me gusta poner todas mis tareas cron en un directorio apropiadamente nombrado, luego hacer una tarea de rake que las envuelve, por lo que es trivial ejecutarlas manualmente. Es una pena que Rake haga esto, porque realmente preferiría tener la opción de aprovechar las dependencias. En cualquier caso, solo apunta a cron directamente en los scripts en lugar de ejecutarlos a través de cron.
Actualmente estoy en el medio de la construcción de una aplicación web que depende en gran medida de los procesos asíncronos, y tengo que decir que estoy muy, muy contento de haber decidido no utilizar Rails.
me gustaría añadir que, si bien Yehuda ha aceptado esta respuesta no considero lo que funciona mejor para mí ser el mejor para otras personas. Mis prioridades como administrador de sistema terrible son reducir las tareas de administrador de sistema :) Si tiene más habilidades allí o una necesidad de una solución de mayor rendimiento, pruebe con uno de los sistemas de cola más esotéricos. –