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
Made with Slides.com