3USD tu primer mes de Premium 馃槺 Canjear promo No me interesa

notifications Notificaciones

Marcar todas como le铆das

Ver m谩s

lightbulb_outline

Trabajando con ActiveJob en Ruby On Rails.

timer 3 Min.

remove_red_eye 4528

calendar_today 04/07/19

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 鈥減erform()鈥 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

Otros art铆culos del blog

Comunidad