2012-09-07 11 views
6

Acabo de heredar un proyecto de Rails y antes estaba en un típico servidor 'nix'. Se tomó la decisión de moverlo a heroku para el cliente y depende de mí lograr que el proceso en segundo plano funcione. Actualmente usa Siempre para programar eventos diarios (correo electrónico, etc.) y activa la cola de tareas retrasadas al arrancar.proceso de reloj personalizado en heroku

Heroku proporciona un ejemplo de documentación para un proceso de reloj personalizado utilizando un mecanismo de relojería, ¿puedo seguir este ejemplo? ¿Alguna dificultad que pueda encontrar? ¿Tendré que crear un dinamómetro de trabajador por separado?

Scheduled Jobs and Custom Clock Processes in Ruby with Clockwork

Respuesta

9

Sí - Cedar pila de Heroku permite ejecutar lo que quiera.

El bloque de construcción básico de la pila de cedros es el dinamómetro. Cada dyno obtiene una copia efímera de su aplicación, 512 MB de RAM y un montón de tiempo compartido de CPU. Se espera que los dynos web vinculen un servidor HTTP con el puerto especificado en la variable de entorno $PORT, ya que es allí donde Heroku enviará solicitudes HTTP, pero aparte de eso, los dynos web son idénticos a otros tipos de dynos.

Su aplicación le dice a Heroku cómo ejecutar sus diversos componentes definiéndolos en el Procfile. (Consulte Declaring and Scaling Process Types with Procfile). El artículo de Clock Processes muestra un patrón en el que utiliza un dyno worker (es decir, no web) para enrutar el trabajo según criterios arbitrarios. De nuevo, puedes hacer lo que quieras aquí, solo defínalo en un archivo de proceso y Heroku lo ejecutará felizmente. Si utiliza un proceso de reloj (por ejemplo, 24x7 whenever), usará un banco de pruebas completo ($ 0.05/hora) para hacer nada más que programar el trabajo.

En su caso, consideraría cambiar de Whenever a Heroku Scheduler. Scheduler es básicamente un cron de ejecución Heroku, donde las entradas de crontab son "girar un banco de pruebas y ejecutar este comando". Seguirás pagando $ 0.05/hora por los dineros adicionales, pero a diferencia de la configuración de reloj + trabajador, solo pagarás por el tiempo que realmente gastan en correr. Limpia separadamente las tareas periódicas del tráfico de web + trabajador en estado estable, y generalmente también es mucho más económico.

La única otra palabra de advertencia es que ejecutar tareas periódicas en sistemas distribuidos es complejo y tiene modos de falla complejos. Algunos de los incidentes de la plataforma (que corresponden a las grandes interrupciones de EC2) han resultado en cosas como 2 procesos de reloj simultáneos y ejecuciones duplicadas del programador. Si está haciendo algo que necesita ejecutarse en serie (como enviar correos electrónicos a las personas una vez al día), considere protegerlo con el bloqueo de RDBMS y verifique dos veces que en realidad han pasado ~ 23 horas desde su trabajo diario.

+0

Sí, definitivamente estoy buscando cambiar mis tareas siempre al planificador, pero aún necesitamos el proceso de fondo constante para ejecutar la cola de trabajos retrasados. Ahora mi único problema es que el DJ q ejecuta todas las tareas a la vez todos los días cuando se reinicia, Heroku UTC v las veces EST en el problema DB probablemente ... ¿Alguna vez ha tenido algún problema con el momento en Heroku? – TheIrishGuy

+0

he portado algunas aplicaciones a entornos de Heroku que asumen un determinado huso horario. Se puede decir 'config heroku: set TZ = ' para ajustar la hora local para los procesos de aplicación, y decir 'MODIFICAR USUARIO SET zona horaria = ' para cambiar la zona horaria de base de datos a través de una variable de sesión. – willglynn

+0

me acaba de aclarar que no creo que '' whenever' es una joya 24x7' proceso reloj. Es simplemente una herramienta para generar crontabs (que no creo que el trabajo en Heroku). Otras gemas, aunque, al igual que 'clockwork' procesos de reloj 24x7 _are_, que serían costosos de operar sólo para el trabajo en segundo plano ocasional. –

0

Heroku Scheduler suele ser una mala opción para el uso en producción porque es unreliable y omite ejecutar sus tareas a veces.

La buena noticia es que si ejecuta un generador de filas de trabajos con Sidekiq hay complementos de programación para ello, p. sidekiq-cron. Con eso puedes usar el mismo banco de pruebas para la programación. Y si aún no tiene un trabajador de trabajos, debe configurarlo solo para programar si necesita ejecutarlo de manera confiable.

P.S. Si ejecuta Delayed::Job para la búsqueda de trabajos, también hay complementos de programación, p. this one.