Sidekiq perde jobs se o servidor for reiniciado?

220 views
Skip to first unread message

Rodrigo Mendonça

unread,
Jan 6, 2016, 5:15:58 AM1/6/16
to rail...@googlegroups.com
Se eu reiniciar o servidor e o sidekiq estiver executando um job naquele momento, ele não vai concluir aquele job, e nem vai tentar executar novamente quando servidor iniciar.

Fiz um teste: Agendei mil jobs, e reiniciei o servidor várias vezes (heroku). Somente 97% dos jobs foram completos. Isso me preocupou muito, pois faço deploys o tempo todo, E a cada deploy meu server é reiniciado.

Problema: Meu sistema está em produção. É um sistema financeiro, e tenho vários clientes utilizando. Ou seja, não posso permitir que o sidekiq execute somente 97% do trabalho.

Perguntas: 

  1. Qual a boa prática para deploys quando se tem job executando em background?
  2. Como lidar Se a máquina falhar e meu servidor reiniciar sozinho?
  3. Sidekiq tem tolerancia a esse tipo de falhas? Alguma outra ferramente tem?

--
Rodrigo Mendonça

Gustavo Kloh

unread,
Jan 6, 2016, 5:31:47 AM1/6/16
to rail...@googlegroups.com
Pra começar o ideal é que você tenha uma estratégia de deploy com downtime 0.

O sidekiq vai falhar os jobs que estão em execução se não existir nenhum esquema de retry desses jobs através da fils. Como a fila de jobs fica lá no Redis, os próximos serão executados quando o servidor voltar.



--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Gustavo Kloh
Fullstack web developer at DTMTec

Rodrigo Mendonça

unread,
Jan 6, 2016, 6:23:59 AM1/6/16
to rail...@googlegroups.com
Valeu pela resposta Gustavo.
O que acontece é que
  • Heroku tem zero downtime deployment
  • Sidekiq está com retry para true, mas quando o servidor é reiniciado infelizmente ele parece não saber fazer isso
Estou sem norte

Alex Takitani

unread,
Jan 6, 2016, 6:39:00 AM1/6/16
to rail...@googlegroups.com
Eu uso essa gem


Um dos passos antes do deploy é parar o sidekiq

Cassio Soares Cabral

unread,
Jan 6, 2016, 6:59:23 AM1/6/16
to rail...@googlegroups.com
Uso essa gem que o Alex indicou e ela faz o que vc quer. Se vc der um kill no Sidekiq ele vai(pode) perder alguns jobs. Usando o método de parar ele termina o job ativo antes de reiniciar. Minha dúvida sempre foi, e se tiver um job com meia hora de duração pra terminar, o deploy fica lá aguardando ?

Rodrigo Mendonça

unread,
Jan 6, 2016, 7:51:14 AM1/6/16
to rail...@googlegroups.com
Vou dar uma olhada nessa gem.
Cassio, o ponto é justamente esse. Eu tenho jobs de 30 segundos a 2 minutos. Trabalho com rateios de condomínios de mil unidades. Cada unidade é um job que vai:
  1. Agrupar a composição da cobranca 
  2. Criar cobranca
  3. Criar boleto
  4. Enviar boleto no email
  5. Gerar logs de tudo que foi feito
Pergunta: Essa gem vai esperar meu job terminar antes de dar o stop no sidekiq?

Everaldo Gomes

unread,
Jan 6, 2016, 8:25:13 AM1/6/16
to rail...@googlegroups.com

Não dá pra salvar os Jobs no sgbd? Acho que sim, Hein.

Alex Takitani

unread,
Jan 6, 2016, 8:27:04 AM1/6/16
to rail...@googlegroups.com

Cassio Soares Cabral

unread,
Jan 6, 2016, 8:30:10 AM1/6/16
to rail...@googlegroups.com
Então, onde usei, os jobs n duravam mais de 1 minuto. Aí nunca esperei muito para terminar o deploy. Sei que ele espera o job ativo terminar, mas para casos de jobs muitos longos n sei dizer qual o procedimento.

@Everaldo, o Sidekiq usa o Redis e ele salva os jobs(os dados para gerar o job na verdade) para caso precise reexecutar.

Everaldo Gomes

unread,
Jan 6, 2016, 9:03:26 AM1/6/16
to rail...@googlegroups.com

@Cassio, o Redis, por padrão, não persiste, né?  Deve ter gemas para outros bancos, se não falha a memória (railscast)

Alex Takitani

unread,
Jan 6, 2016, 9:12:09 AM1/6/16
to rail...@googlegroups.com
Não, Everaldo Sidekiq só no Redis e ele persiste.

Everaldo Gomes

unread,
Jan 6, 2016, 9:12:52 AM1/6/16
to rail...@googlegroups.com

Obrigado.

Rodrigo Mendonça

unread,
Jan 6, 2016, 11:22:10 AM1/6/16
to rail...@googlegroups.com
Agora é oficial. Acabei de fazer mais testes e confirmo. Os jobs são perdidos

Teste executado
  1. Instalei o sidekiq ui (facilita ver jobs na: fila, executando, que falharam, que morreram...)
  2. Criei um job que atualiza um contador no banco de dados, mas antes tem um sleep de 90 segundos
  3. Configurei o sidekiq para executar 2 jobs por vez
  4. Agendei 10 jobs
  5. Matei e liguei o server 5 vezes
Resultado
  1. Em menos de 30 segundos Religando o Server 5 vezes,  todos os jobs foram caindo no esquecimento. Sidekiq UI me mostrou isso. Ele NÂO é marcado como fail, nem dead. Eles apenas somem
  2. O contador não saiu da estaca ZERO

 REZE para não ter algum job importante e pesado executando quando:
  1. Seu servidor reiniciar sozinho (isso acontece se a memória RAM estourar no heroku)
  2. Nginx reiniciar sozinho
  3. Você precisar reiniciar o servidor
  4. Durante deploys

Alex Takitani

unread,
Jan 6, 2016, 11:30:58 AM1/6/16
to rail...@googlegroups.com
2. O nginx não influi no sidekiq
3. Sim, se vc não parar o sidekiq vai ter problema
4 . Igual ao 3.

Pra resolver o 1 vc precisa do sidekiq pro  http://sidekiq.org/products/pro



Ω Alisson

unread,
Jan 6, 2016, 11:31:22 AM1/6/16
to rail...@googlegroups.com
Isso não é característica do Sidekiq free?

Ω Alisson

unread,
Jan 6, 2016, 11:32:04 AM1/6/16
to rail...@googlegroups.com
Ou aprenda Redis. Não é difícil criar uma fila confiável. Tem o Disque também, que agora está na versão 1.0 RC

thiagocifani

unread,
Jan 6, 2016, 12:12:21 PM1/6/16
to rail...@googlegroups.com
Para nao perder o Job, você deveria ter o sidekiq pago. Porém, se usar a gem shoryuken, você consegue não perder o conteúdo.


Shoryuken usa Amazon SQS para armazenar a fila. E isso não é perdido caso o job quebre.

[]'s

Ruan Carlos

unread,
Jan 6, 2016, 12:18:48 PM1/6/16
to rail...@googlegroups.com

Rodrigo Mendonça

unread,
Jan 6, 2016, 3:05:59 PM1/6/16
to rail...@googlegroups.com
Realmente o sidekiq free não é tolerante a falhas. Agora estou estudando o Resque e o Shoryuken
Pelo que li o shoryuken é extremamente confiável e tem a performance foda do sidekiq

Meus ambientes
  1. development: Docker
  2. staging: Heroku
  3. production: Cloud66

Tem que funcionar em tudo  =)
Message has been deleted

Alexei Telles

unread,
Jan 6, 2016, 5:38:29 PM1/6/16
to rails-br
Rodrigo, eu uso a gem clockwork no Heroku e flags no banco pra controlar os jobs.

Funciona lindo.

Rodrigo Mendonça

unread,
Jan 7, 2016, 9:31:32 AM1/7/16
to rail...@googlegroups.com
Alexei eu tambéi utilizo esse tipo de jobs para rotinas diárias, semanais e mensais. Utiliza a gem whenever.  Quando eu uso a gem sidekiq é pra fazer esse tipo de coisa

def registrar_entrada_visitante
  ...
  @vistante.entrou_em = Time.zone.now
  if @visitante.save
    @visitante.delay.processar_foto_pesada(...) # vai pra background, e a resposta mando depois com websocket
    render json: @visitante
  else
    ...
  end
end


Outra coisa, fiz uma comparação entre Resque e Shoryuken

Resque

Contras
* Não trabalha com threads (menos performance que sidekiq e shoryuken)

Prós
* Agendar jobs sem precisar de nenhuma configuração adicional
* Jobs não falham
* Suporta múltiplas filas com prioridades diferentes



Shoryuken

Contras
* Dificil configura pra agendar jobs. Precisa de:
** Mais uma Gem
** DynamoDB do Amazon (além do SQS)
** Um bundle exec a mais nas configurações...

Prós
* Trabalha com Threads (tão performático quanto ao sidekiq)
* Jobs não falham
* Suporta múltiplas filas com prioridades diferentes





Em 6 de janeiro de 2016 20:38, Alexei Telles <alex...@gmail.com> escreveu:
Rodrigo, eu uso a gem clockwork no Heroku e flags no banco pra controlar os jobs.

Funciona lindo.
--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.



--

Alex Takitani

unread,
Jan 7, 2016, 10:12:24 AM1/7/16
to rail...@googlegroups.com
Legal Rodrigo! 

Realmente, usando a amazon aumenta o custo também.

Eu uso resque em alguns projetos, se vc não precisa de taaaaaaaanta performance, ele funciona bem.

Acho que vale também pensar nos $950 do sidekiq, as vezes colocando na ponta do lapis sai mais barato.

Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Rodrigo Mendonça

unread,
Jan 7, 2016, 10:59:13 AM1/7/16
to rail...@googlegroups.com
Eu olhei os preços do SQS do amazon. Custa $0.50 por MILHÃO de jobs. É muito barato.
O que me desanimou quanto ao Shoryuken foi essa configuração adicional para AGENDAR jobs.
Usamos bastante coisas assim:  MuralRecado.delay_for(2.minutes).enviar_email_caso_nao_lido(...)

Esses nomes são só para facilitar o entedimento.. =)

Mas a idéia é que usamos bastante de jobs em background e o requisito é: 
  1. Suportar várias filas com prioridades (critical, default e lower)
  2. Agendar jobs
  3. Não falhar.. rs
--

Reply all
Reply to author
Forward
0 new messages