Corre tus tareas recurrentes con Sidekiq
Tags: ruby, rails, tutorial, redis
Published: 2021-06-07 16:18:11

En Webdox utilizamos **[Sidekiq](https://github.com/mperham/sidekiq)** como nuestra plataforma para procesar tareas asíncronas.  **Sidekiq** utiliza hilos (threads) para manejar varias tareas al mismo tiempo en un mismo proceso.

Tenemos muchas tareas que ejecutamos de forma asíncrona con Sidekiq, por ejemplo: El envío de notificaciones por correo, la reindexación de contratos, la generación masiva de contratos y el inicio de la firma electrónica de cada contrato masivo, etc

**Sidekiq** se puede usar de forma gratuita y de forma paga.  Cuando usamos la forma gratuita hay ciertas funcionalidades que no se incluyen y una de estas es ejecutar CRON JOBS.  Con esta funcionalidad podríamos tomar una tarea de Sidekiq y ejecutarla recurrentemente cada cierto tiempo con [Cron jobs](https://www.hostinger.es/tutoriales/cron-job)

Afortunadamente existen Gemas que funcionan como plugins de Sidekiq y en Webdox utilizamos una para ejecutar tareas recurrentes de forma gratuita, su nombre es **[Sidekiq Scheduler](https://github.com/Moove-it/sidekiq-scheduler)**

A continuación un pequeño tutorial de cómo utilizar Sidekiq Scheduler

## Instalación y Configuración

Agregamos la gema en nuestro Gemfile
```ruby
# Gemfile
gem 'sidekiq-scheduler'
```
y Ejecutamos:
 ```
bundle install
```

Creamos un Worker de Sidekiq el cual se ejecutará cada cierto tiempo.

```ruby
hello_world_worker.rb

require 'sidekiq-scheduler'

class HelloWorldWorker
  include Sidekiq::Worker

  def perform
    puts 'Hello world'
  end
end
```
Para configurar la periodicidad del Worker modificamos el archivo de configuración de Sidekiq, un apartado de Scheduler:

```yaml
# config/sidekiq.yml

:schedule:
  hello_world:
    cron: '0 * * * * *'   # Runs once per minute
    class: HelloWorldWorker
```

Y corremos Sidekiq:
```sh
bundle exec sidekiq -C config/sidekiq.yml
```
Una vez iniciado Sidekiq veremos como se imprime "Hello world" cada minuto.

```
2021-06-07T15:54:38.710Z 62465 TID-ownzi9r98 INFO: Running in ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin20]
2021-06-07T15:54:38.710Z 62465 TID-ownzi9r98 INFO: See LICENSE and the LGPL-3.0 for licensing details.
2021-06-07T15:54:38.710Z 62465 TID-ownzi9r98 INFO: Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org
2021-06-07T15:54:38.723Z 62465 TID-ownzi9r98 INFO: Loading Schedule
2021-06-07T15:54:38.723Z 62465 TID-ownzi9r98 INFO: Schedule empty! Set Sidekiq.schedule
2021-06-07T15:54:38.724Z 62465 TID-ownzi9r98 INFO: Schedules Loaded
2021-06-07T15:54:38.734Z 62465 TID-ownzi9r98 INFO: Reloading Schedule
2021-06-07T15:54:38.734Z 62465 TID-ownzi9r98 INFO: Loading Schedule
2021-06-07T15:54:38.790Z 62465 TID-ownzi9r98 INFO: Scheduling hello_world {"cron"=>"0 * * * * *", "class"=>"HelloWorldWorker", "queue"=>"default"}
2021-06-07T15:54:38.791Z 62465 TID-ownzi9r98 INFO: Schedules Loaded
2021-06-07T15:54:38.791Z 62465 TID-ownzi9r98 INFO: Starting processing, hit Ctrl-C to stop
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-4a465f9e9646157552de7f5c INFO: start
Hello world
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-4a465f9e9646157552de7f5c INFO: done: 0.0 sec
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-64dc6b6cb06ebf580c3faae6 INFO: start
Hello world
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-64dc6b6cb06ebf580c3faae6 INFO: done: 0.0 sec
```
Además tenemos la opción de visualizar las tareas recurrentes en el panel de administración de Sidekiq si realizamos la siguiente configuración:
```ruby
# config.ru

require 'sidekiq/web'
require 'sidekiq-scheduler/web'

run Sidekiq::Web
```

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msluy07gqr7th4o4tvxu.png)


Por último recomendamos utilizar la página [CronTabGurú](https://crontab.guru/) para cuando necesitemos configurar la periodicidad de las tareas recurrentes con la sintaxis de Cron Jobs.

Tener en cuenta que la sintaxis de cron jobs que utiliza Sidekiq Scheduler tiene una sección extra en la parte de adelante la cual nos permite configurar los segundos.