Cómo poner en cola un trabajo de larga duración de la mejor manera

Así que tengo un plugin que inicia Ansible para realizar una instalación de Discourse (¡realmente, realmente, quiero dejar de usar WordPress para gestionar los pedidos de instalación!).

Inicialmente, llamaba a fork para iniciarlo, lo cual funcionaba bien en las pruebas, pero pensé que debería hacerlo de una manera más «a lo Discourse».

Así que luego creé un trabajo único para ejecutar el proceso, pero se mata de esta manera:

E, [2020-12-16T12:53:39.662683 #3158277] ERROR -- : worker=0 PID:3158425 timeout (61s > 60s), killing

Intenté agregar sidekiq_options queue: 'low' a la clase y luego a la función que ejecuta el trabajo.

Luego omití que el trabajo ejecutara el proceso y simplemente lo ejecuté directamente en el modelo con:

         Discourse::Utils.execute_command(*instructions)

Funciona perfectamente si lo ejecuto desde rails c, pero sin importar cómo lo ejecute (este es un entorno de desarrollo en Ubuntu, iniciado con ./bin/unicorn), se mata.

1 me gusta

Los trabajos únicos son aquellos que solo se ejecutan, bueno, una vez. Parece que lo que necesitas es un trabajo regular que se programará mediante un disparador, como una solicitud que llega a un controlador.

Los trabajos regulares pueden durar más de 60 segundos, como ocurre con algunos en el uso normal.

1 me gusta

Bueno, lo moví a un trabajo regular e intenté ejecutarlo con ./bin/rails s en lugar de ./bin/unicorn, pero aún así no hubo éxito.

Esto no tiene sentido, porque sé que muchos de esos trabajos tardan más de un minuto.

¿Cómo estás ejecutando exactamente el trabajo? ¿Puedes pegar la parte relevante del código de Ruby?

¡Por supuesto!

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/jobs/regular/create_droplet.rb

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/models/pfaffmanager/server.rb#L150-L172

¿Por qué estás usando

Jobs::CreateDroplet.new.execute(server_id: id)

en lugar de

Jobs.enqueue(:create_droplet, server_id: id)

en https://github.com/pfaffman/discourse-pfaffmanager/blob/49f7369b1dc0b1c8f63065b14c92ac7ecc3ab2b3/app/models/pfaffmanager/server.rb#L146?

2 Me gusta

¡Y por eso necesito hacer preguntas! Es porque solo soy un hombre de las cavernas. (Sin ofender a nadie que viva en una cueva.)

Por supuesto, no hay ninguna razón. ¡Simplemente no pude averiguar cómo se suponía que debía llamarlo!

¡Muchas gracias!

… ¡y sigue ejecutándose! …

Muchas gracias. Esto me llevó al menos un par de horas…

Siguiente paso: ejecutarlo en un servidor de producción real…

4 Me gusta