Nós não Executar Tarefas Agendadas no à porta

Fundo

No à porta, podemos executar uma série de tarefas agendadas para vários fins, tais como o envio de dezenas de milhões de digerir e-mails para nossos usuários diários, gerando relatórios internos do nosso crescimento, e algumas tarefas operacionais. Como muitas outras empresas de internet (por exemplo, Airbnb e Quora), começamos com Cron e acabamos construindo nosso próprio substituto cron, que chamamos Nextdoor Scheduler.

estamos usando o Scheduler Nextdoor há mais de 18 meses e estamos extremamente felizes com isso.Então, qual é o problema com o Cron?

existem quatro problemas principais com Cron.

First, the way we use Cron was not scalable. Executamos todos os trabalhos de Cron em uma máquina de escalonamento beefy (c3.8xlarge). Como nós ganhamos a tração, trabalhos de Cron empurraram a máquina ao seu limite, em termos de utilização de recursos computados.

Second, editing the plain text crontab is error prone for managing jobs, e.g., adding jobs, deleting jobs, or pausing jobs. Por exemplo, um asterisco adicional impediu todos os postos de trabalho de produção de funcionar no outro dia:

1 * * * * * /opt/nextdoor/some_job.sh

Third, we incended a lot of operational overhead with Cron. Temos perto de duzentos empregos de produção que são executados milhares de vezes por dia ,em frequência diferente (por exemplo, minutely, hourly, weekly). Falhar no trabalho é comum. A pessoa oncall teve que reiniciar manualmente trabalhos falhados várias vezes por dia, às vezes depois da meia-noite. Aqui está um exemplo de uma experiência oncal típica: 1) ser chamado com a linha de comandos da tarefa falhada; 2) ssh na máquina de escalonamento; 3) copiar & colar a linha de comandos para repetir a tarefa falhada. Isso certamente não é bom para a felicidade de engenharia — Sim, nós nos preocupamos com a felicidade de nossos funcionários!

em quarto lugar, tivemos pouca visibilidade para trabalhos de produção durante a execução. Não havia uma maneira fácil de saber que empregos estavam funcionando ou se eles foram bem sucedidos.

decisão

basta. Decidimos construir uma substituição de cron. Mas porque não usamos soluções de código aberto? Não conseguimos encontrar um adequado. Falamos python. Queríamos alavancar os componentes de infraestrutura existentes na empresa. Queríamos construí-la, compreendê-la e possuí-la.

para abordar a questão da escalabilidade, fizemos de cada trabalho uma tarefa async que pode funcionar em um conjunto de máquinas de trabalho de Tarefas. Podemos configurar facilmente as tarefas que correm no Taskworker para repetir automaticamente quando elas falham, o que requer apenas uma única mudança de código de linha. Os nossos engenheiros da oncall adoram este recurso de auto-repetição!

para substituir o Cron, usámos o excelente ApScheduler do módulo python para agendar tarefas, o que nos permitiu gerir tarefas programaticamente — construímos APIs de descanso, ferramentas de linha de comando e interface web amiga do homem.

Arquitetura

a imagem a seguir mostra a arquitetura do nosso sistema de escalonamento.

à porta Programador é implementado com a linguagem Python / Tornado. Ele é executado como um único processo de daemon (Scheduler Process) em uma única máquina, que consiste em três componentes.

  1. Scheduler (ou Scheduler de núcleo). Ele substitui cron e agenda trabalhos para executar. Quando um trabalho é despoletado para executar, o processo Scheduler simplesmente publica uma mensagem para o trabalho para o SQS Amazon. Um conjunto de máquinas de trabalho de Tarefas pegar mensagens de SQS Amazon e executar trabalhos correspondentes. Como mencionado acima, usamos o APScheduler para implementar o scheduler core.
  2. API Scheduler. Ele fornece uma interface de descanso para gerenciar empregos, por exemplo, adicionando empregos, pausando/retomando um trabalho, removendo empregos, modificando empregos, e manualmente chutando um trabalho. Construímos ferramentas de linha de comando em cima da API Scheduler para facilitar as operações, por exemplo, parando um grupo de trabalhos de uma só vez.
  3. UI Web. É um aplicativo de página única falando com a API Scheduler. Usámos espinha dorsal.js e Bootstrap para implementar a interface Web. Operadores humanos usam principalmente a interface web para interagir com o Scheduler Nextdoor.

a informação de todos os empregos e execuções de empregos é armazenada num armazém de dados. Usamos Postgres principalmente aqui na Nextdoor.

UI Web

os engenheiros adoram UI Web do Nextdoor Scheduler, que fornece uma forma intuitiva de gerenciar empregos ao invés de lidar com Cron de caixa preta nos velhos tempos.

Página de Empregos

nesta página, podemos ver que trabalho temos e quando eles será executada na próxima vez. Também podemos clicar em “execução personalizada” para iniciar manualmente um trabalho.

Edição de um Trabalho

podemos facilmente editar uma tarefa, por exemplo, alterar a sua agenda e pausá-lo com um clique no botão! Isto é muito melhor do que modificar o texto simples crontab nos velhos tempos.

Execuções Página

Finalmente, nós temos uma grande visibilidade para que os trabalhos estão sendo executados e se eles conseguem ou não.

rolar para fora

escrever código é fácil. A produção é difícil. Quando terminámos a implementação do Nextdoor Scheduler, tínhamos cerca de 200 postos de trabalho de Cron de produção que precisam migrar para o novo sistema.

aplicamos o que aprendemos com o projeto Taskworker para implantar o sistema de Scheduler Nextdoor. Quatro passos:

  1. nós dark lançou Nextdoor Scheduler para a produção – nenhum trabalho de produção estava funcionando com o novo sistema ainda.
  2. nós adicionamos uma mudança de recurso para a classe base de todos os trabalhos.
  3. ligámos lenta e cuidadosamente os interruptores de recursos para cada trabalho durante duas semanas.
  4. desligamos a antiga máquina de escalonamento beefy que rodava Cron.

Happy Ending

With the new Nextdoor Scheduler, we are able to run a much cheaper scheduler EC2 instance (c3.2xlarge) than before (c3.8xlarge), while keeping the load super low as we offload jobs to run on distributed Taskworker machines.

aqui está a comparação de Utilização do CPU entre a máquina antiga de escalonamento (grafo superior)e a nova máquina de escalonamento (grafo inferior):

Temos vindo a utilizar o Programador de tarefas para mais de 18 meses. Estamos felizes até agora. Se você está interessado em trabalhar neste tipo de problemas e outros desafios de infraestrutura interessantes, estamos contratando!

Deixe uma resposta

O seu endereço de email não será publicado.