Amazon
poderia perder $1.6 bilhão por ano se o
tempo de carre amento aumentasse
apenas 0.5s.
http://fnando.me/ip
Slide 4
Slide 4 text
Goo le
estimou que 8 milhões de buscas
diárias deixariam de ser realizadas se o
tempo de carre amento aumentasse
apenas 0.04s.
http://fnando.me/ip
Slide 5
Slide 5 text
Para ser rápida, uma requisição precisa
fazer poucas coisas.
Velocidade
Slide 6
Slide 6 text
[email protected]
••••••••••
Your e-mail address
Type your password
Si nup
Slide 7
Slide 7 text
Verifica unicidade,
salva no banco,
indexa…
Envia e-mail de
confirmação/
boas-vindas…
Adiciona no
índice de busca…
Gera métricas…
Slide 8
Slide 8 text
Al umas tarefas estão fora de seu
controle e podem demorar muito (ou até
mesmo dar timeout).
Imprevisível
Slide 9
Slide 9 text
adjective
In computer pro rammin , asynchronous events are those
occurrin independently of the main pro ram flow.
Asynchronous actions are actions executed in a non-blockin
scheme, allowin the main pro ram flow to continue
processin .
a•syn•chro•nous
Slide 10
Slide 10 text
Back round Jobs
Slide 11
Slide 11 text
Relatórios.
Envio de e-mails.
Processamento de ima ens.
Chamadas a serviços externos.
Indexação.
Back round
Slide 12
Slide 12 text
Tudo o que não é necessário para
construir a resposta da requisição HTTP.
Slide 13
Slide 13 text
Como funciona
Fila
Producer Consumer
Producer adiciona
jobs na fila.
O Consumer reserva
um job para executar.
Slide 14
Slide 14 text
Existem muitos projetos que se
propõem a resolver este problema.
Alternativas
Mais funcionalidades e licença comercial
em vez de LGPLv3.
Sidekiq Pro
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
class MailerWorker
include Sidekiq::Worker
def perform(user_id, mail)
user = User.find_by_id(user_id)
return unless user
Mailer.public_send(mail, user)
end
end
Slide 22
Slide 22 text
MailerWorker
.perform_async(user.id, "welcome")
Slide 23
Slide 23 text
Mensa ens pequenas que uardam
ações e ids.
Stateless
O job pode ser executado várias vezes
sem criar efeitos colaterais maiores
que a tarefa do próprio job.
Idempotente
Slide 28
Slide 28 text
Al umas tarefas não podem ser repetidas.
Não-Idempotente
Slide 29
Slide 29 text
Idempotente
Cancelar pedido
Atualizar e-mail do usuário
Re-exportar ima ens
Não-idempotente
Enviar e-mail de notificação
Fazer cobrança no cartão de crédito
Slide 30
Slide 30 text
Se o job falhar, desfaça as alterações que
foram feitas (use uma transação de banco
de dados, por exemplo).
Transacional
Slide 31
Slide 31 text
class BillingWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find_by_id(user_id)
return unless user
Billing.process(user)
Mailer.billed(user).deliver!
end
end
Slide 32
Slide 32 text
class BillingWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find_by_id(user_id)
return unless user
Billing.process(user)
Mailer.billed(user).deliver!
end
end
Slide 33
Slide 33 text
class BillingWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find_by_id(user_id)
return unless user
Billing.process(user)
MailerWorker
.perform_async(user.id, "billed")
end
end
Slide 34
Slide 34 text
Assuma que o Sidekiq irá executar seu
job pelo menos uma vez.
Slide 35
Slide 35 text
Entenda quais são os
termos usados pelo Sidekiq.
Terminolo ia
Slide 36
Slide 36 text
Client
É quem adiciona os jobs para
processamento em back round.
Server
É quem pe a os jobs para serem
processados.
Slide 37
Slide 37 text
Veja o que você pode confi urar no Sidekiq
Confi uração
Slide 38
Slide 38 text
Sidekiq.configure_server do |config|
config.redis = {
url: "redis://redis.example.com:7372/12",
namespace: "mynamespace"
}
end
Sidekiq.configure_client do |config|
config.redis = {
url: "redis://redis.example.com:7372/12",
namespace: "mynamespace"
}
end
class BillingWorker
include Sidekiq::Worker
sidekiq_options queue: :critical
def perform
# ...
end
end
Slide 41
Slide 41 text
Às vezes precisamos ter acesso às
estatísticas de processamento.
Estatísticas
Slide 42
Slide 42 text
stats = Sidekiq::Stats.new
stats.processed # how many jobs have been processed
stats.failed # how many jobs have failed
stats.queues # queues and number of enqueued jobs
stats.enqueued # total count of enqueued jobs
Mas às vezes precisamos executar
tarefas recorrentes.
Slide 48
Slide 48 text
https:// ithub.com/tomykaira/clockwork
require "./config/environment"
require "clockwork"
module Clockwork
configure do |config|
config[:tz] = "America/Sao_Paulo"
end
every(1.day, "mailer.followup", at: "02:00") do
FollowupWorker.perform_async
end
end
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.
Back round Job All The Thin s.