Background Jobs

O problema

O problema (1/2)

Imagine ter que enviar um email de campanha para milhares de usuários da sua plataforma. Para isso, você cria uma funcionalidade de escrever o email em sua própria plataforma, selecionar para quem deve ser enviado (todos os usuários) e clicar em "Enviar".

 

Quanto tempo você teria que esperar?

O problema (2/2)

Imagine criar uma funcionalidade que permite que usuários definam lembretes para serem enviados em certos dias/horários.

 

Como você implementaria isso?

Setup

Redis

Pense no Redis como um "Banco de Dados" onde, ao invés de tabelas, as estruturas dos dados são Hashes (aka key-value store)

# On macOS
brew update
brew install redis
brew services start redis

# On Ubuntu
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update
sudo apt-get install redis
sudo apt-get install redis-server

Redis

Se quisermos "zerar" o Redis, podemos executar o seguinte comando:

redis-cli flushall

Sidekiq

O sidekiq é o executador de processos no background, utilizando as infos armazenadas no Redis para saber quais processos precisam ser executados, em qual ordem e com quais parâmetros.

 

Para utilizarmos o Sidekiq em um projeto Rails, precisamos adicionars suas gems ao Gemfile

# Gemfile
gem "sidekiq", "~> 7"
gem "sidekiq-failures"

Não esqueçam do bundle install!

Sidekiq

Também precisamos adicionar o comando do Sidekiq ao nosso terminal, para iniciá-lo! Podemos fazer isso com

bundle binstub sidekiq

Sidekiq

Além das gems, precisamos configurar o Rails e o próprio Sidekiq!

# config/application.rb
# [...]
class Application < Rails::Application
  # [...]
  # defina o Sidekiq como o "executador de processos" do Rails
  config.active_job.queue_adapter = :sidekiq
end
# config/routes.rb
Rails.application.routes.draw do
  # Sidekiq Web UI, only for admins.
  require "sidekiq/web"
  authenticate :user, ->(user) { user.admin? } do
    mount Sidekiq::Web => '/sidekiq'
  end
end

Sidekiq

Além das gems, precisamos configurar o Rails e o próprio Sidekiq!

# config/sidekiq.yml
:concurrency: 3
:timeout: 60
:verbose: true
:queues:
  # Queue priority:
  # https://github.com/sidekiq/sidekiq/wiki/Advanced-Options
  - default
  - mailers

Background Jobs

By Rafael Pereira Alonso

Background Jobs

Nona Aula da Atividade Complementar de Ruby On Rails, lecionada na Universidade Federal de São Carlos, campus Sorocaba, no primeiro semestre de 2019

  • 5