arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Trabajando con ActiveJob en Ruby On Rails.

Eduardo Torres

Estudiante

av_timer 3 Min. de lectura

remove_red_eye 11156 visitas

calendar_today 04 Julio 2019

Durante el desarrollo, planeación y diseño de un proyecto en RoR se determinan muchas de las funcionalidades con las que debe contar, normalmente una de ellas es el agendar una tarea para su ejecución en otro momento de manera asincrona con nuestro proyecto.

¿Qué son y cómo funcionan?

ActiveJob funciona principalmente para declarar “Jobs” (Trabajos) en nuestro proyecto, encargados de ejecutarse en segundo plano, su estructura principal se basa en una cola de procesos programados que son ejecutados a medida de su prioridad. Normalmente los Jobs son usados para la realización de actividades necesarias para el cumplimiento de requerimientos que pueden programarse, tal como podría ser desde una limpieza interna en el programa hasta realizar cargos, envío de correos, recordatorios, etc.

La función principal dentro de ActiveJob es que se pueda ejecutar cualquier actividad en pequeñas unidades de trabajo, y correr de manera asíncrona con el proyecto, lo que busca RoR con esto es que todos sus proyectos contengan una estructura de trabajo en la que se establezca la organización de los procesos en segundo plano.

Un dato importante al comenzar a trabajar con esto es que de manera predeterminada, nuestro proyecto cuenta con un método de ejecución asíncrono que permite la ejeción de Jobs en segundo plano, pero se encarga unicamente de almacenarlos en la memoria RAM, de tal manera de al reiniciar el proyecto los Jobs que se encontraban en cola ahora son eliminados.

Implementación

Para crear un Job se debe ejecutar en consola el siguiente comando:

    $ rails generate job say_hello

El cual nos crea un modelo de trabajo en el siguiente directorio app/job, de tal manera que debería contener lo siguiente:

class SayHelloJob < ApplicationJob
  queue_as :default

  def perform(*guests)
    # Do something later
  end
end

Esta clase contiene por default un método llamado “perform()” en el cual puedes definir las diferentes variables con las que va a trabajar el método y su función agendada.

Una vez que se implementa el job dentro de nuestro proyecto, podemos proceder a ejemplificar algunas de las formas existentes de agregar los Jobs en una cola, de manera que se ejecuten según su los parametros asignados.

    SayHelloJob.set(wait: 2.minutes).perform_later(self)
    SayHelloJob.set(wait: 9.hours).perform_later(self)
    SayHelloJob.set(wait_until: Date.tomorrow.noon).perform_later(self)
    SayHelloJob.set(wait: 1.week).perform_later(self)

Una vez que nuestros Jobs se encuentran en su respectiva cola de procesos, se debe agregar cierta extensión al framework en el cual nos encontramos, debido a que Rails únicamente ofrece un sistema de colas con los procesos próximos a ejecutarse, el cual únicamente se encarga de almacenar los procesos en nuestra memoria RAM.

Esto significa que al detener tu proyecto todos trabajos que estaban en cola se eliminarán.

ActiveJob cuenta con varios adaptadores que se incorporan a la cola de procesos en segundo plano, los más conocidos son Sidekiq, Resque, Delayed Job, etc.

En esta ocasión utilizaremos Sidekiq como adaptador para los procesos en segundo plano.

Para dar inicio a su instalación, primero debemos acceder a nuestro archivo /Gemfile y agregar nuestra nueva gema:

    gem "sidekiq"

O podemos instalarlo a través de la consola de la siguiente manera:

  gem install sidekiq

Posteriormente de añadirlo, se procede a ejecutar el conocido bundle install para instalar las gemas existentes en el archivo y/o alguna faltante.

Cabe mencionar que para la ejecución de Sidekiq es necesario contar con redis instalado en nuestro computador, debido a que por defecto intenta conectarse a localhost:6379.

Debe de crear un archivo llamado sidekiq.rb en la ruta config/initializers con el siguiente contenido.

    Sidekiq.configure_server do |config|
        config.redis = { url: 'redis://localhost:6379/0'  }
    end
    Sidekiq.configure_client do |config|
        config.redis = { url: 'redis://localhost:6379/0'  }
    end

Después de definir nuestra configuración de Sidekiq, debemos agregar a nuestra aplicación el adaptador para las colas, así que debemos acceder a la ruta config/application.rb y agregar lo siguiente:

    config.active_job.queue_adapter = :sidekiq

Ahora la configuración para acceder a la interfaz gráfica de Sidekiq, en la cual tendremos acceso a una mejor visualización de nuestros trabajos que se ejecutaron, se están ejecutando o se ejecutarán.

Procederemos a agregar a nuestras rutas en el archivo ubicado config/routes.rb y colocaremos lo siguiente.

    require 'sidekiq/web'
    mount Sidekiq::Web => '/sidekiq'

Una vez generados los cambios en nuestras rutas, realizaremos la última configuración, la cual es el crear un archivo llamado sidekiq.yml ubicado en /config, y debe de contener lo siguiente.

---
:concurrency: 5
staging:
  :concurrency: 10
production:
  :concurrency: 20
:queues:
  - critical
  - default
  - low

Si deseas saber más

Si todo está correctamente instalado, procederemos a ejecutar en otra consola el siguiente comando:

    $ bundle exec sidekiq

Y como resultado deberíamos de obtener lo siguiente:

N0SGY.png