Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Executando Background Jobs

Executando Background Jobs

Background Jobs + Sidekiq

Nando Vieira

July 04, 2013
Tweet

More Decks by Nando Vieira

Other Decks in Programming

Transcript

  1. Amazon poderia perder $1.6 bilhão por ano se o tempo

    de carre amento aumentasse apenas 0.5s. http://fnando.me/ip
  2. 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
  3. Verifica unicidade, salva no banco, indexa… Envia e-mail de confirmação/

    boas-vindas… Adiciona no índice de busca… Gera métricas…
  4. Al umas tarefas estão fora de seu controle e podem

    demorar muito (ou até mesmo dar timeout). Imprevisível
  5. 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
  6. Relatórios. Envio de e-mails. Processamento de ima ens. Chamadas a

    serviços externos. Indexação. Back round
  7. activemq amqp beanstalkd celery cron delayed_job earman hornetq jms ka

    a kestrel mqseries nsq qless qpid rabbitmq resque sidekiq sqs stormmq swiftmq zeromq
  8. O job pode ser executado várias vezes sem criar efeitos

    colaterais maiores que a tarefa do próprio job. Idempotente
  9. 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
  10. Se o job falhar, desfaça as alterações que foram feitas

    (use uma transação de banco de dados, por exemplo). Transacional
  11. 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
  12. 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
  13. 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
  14. Client É quem adiciona os jobs para processamento em back

    round. Server É quem pe a os jobs para serem processados.
  15. 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
  16. 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
  17. stats = Sidekiq::Stats::History.new(2) # 2 days stats.processed # => {

    "2012-12-05" => 1010, "2012-12-04" => 1500 }
  18. 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
  19. 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.