Vi Kjører Ikke Cron-Jobber På Nextdoor

Bakgrunn

På Nextdoor kjører vi mange planlagte jobber for ulike viktige formål, for eksempel å sende titalls millioner digest-e-postmeldinger til brukerne våre daglig, generere interne rapporter om vår vekst og noen operative oppgaver. Airbnb Og Quora), startet Vi Med Cron og endte med å bygge vår egen cron-erstatning, som vi kalte Nextdoor Scheduler.

Vi har brukt Nextdoor Scheduler i over 18 måneder, og vi er svært fornøyd med det.

Så, hva er problemet Med Cron?

Det er fire hovedproblemer med Cron.

for det Første var Måten Vi bruker Cron ikke skalerbar. Vi kjørte Alle Cron jobber på en beefy scheduler maskin (c3.8xlarge). Etter hvert som Vi fikk trekkraft, presset Cron jobs maskinen til sin grense, når det gjelder beregningsressursbruk.

for Det Andre er redigering av ren tekst crontab utsatt for å administrere jobber, for eksempel legge til jobber, slette jobber eller pause jobber. For eksempel forhindret en ekstra stjerne alle produksjonsjobber fra å kjøre den andre dagen:

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

For Det Tredje pådrar Vi mye operasjonell overhead med Cron. Vi har nesten to hundre produksjonsjobber som kjøres tusenvis av ganger om dagen, med forskjellig frekvens(f. eks. Jobbsvikt er vanlig. Oncall-personen måtte manuelt starte mislykkede jobber flere ganger om dagen, noen ganger etter midnatt. Her er et eksempel på en typisk oncall-opplevelse: 1) få vekslet med kommandolinjen til den mislykkede jobben; 2) ssh i planleggingsmaskinen; 3) kopier & lim inn kommandolinjen for å kjøre den mislykkede jobben. Dette er absolutt ikke bra for teknisk lykke-ja, vi bryr oss om våre ansattes lykke!

For Det Fjerde hadde vi liten synlighet for produksjonsjobber under kjøring. Det var ikke lett måte å vite hvilke jobber som kjørte eller om de lyktes.

Beslutning

Nok er nok. Vi bestemte oss for å bygge en cron-erstatning. Hvorfor bruker vi ikke open source-løsninger? Vi kunne bare ikke finne en passende en. Vi snakker python. Vi ønsket å utnytte eksisterende infrastrukturkomponenter i selskapet. Vi ønsket å bygge det, forstå det og eie det.

for å løse problemet med skalerbarhet, gjorde vi hver jobb en asynkron oppgave som kan kjøres på en klynge Av taskworker-maskiner. Vi kan enkelt konfigurere jobber som kjører På Taskworker å automatisk prøve på nytt når de mislykkes, noe som krever bare en enkelt linje kodeendring. Våre oncall ingeniører elsker denne auto-retry funksjonen!

for å erstatte Cron brukte Vi den utmerkede python-modulen ApScheduler til å planlegge jobber, noe som gjorde det mulig for oss å administrere jobber programmatisk.

Arkitektur

følgende bilde viser arkitekturen til Planleggingssystemet vårt.

Nextdoor Scheduler er implementert Med Python / Tornado. Det kjøres som en enkelt daemon prosess (Scheduler Prosess) på en enkelt maskin, som består av tre komponenter.

  1. Planlegger (Eller Kjerneplanlegger). Den erstatter cron og tidsplaner jobber for å kjøre. Når en jobb utløses for å kjøre, publiserer Planleggingsprosessen bare en melding for jobben Til Amazon SQS. En klynge Av Taskworker maskiner hente meldinger Fra Amazon SQS og kjøre tilsvarende jobber. Som nevnt ovenfor bruker Vi APScheduler til å implementere core scheduler.
  2. Planleggings-API. DET gir EN REST grensesnitt for å administrere jobber, f. eks legge til jobber, pause/gjenoppta en jobb, fjerne jobber, endre jobber, og manuelt sparker av en jobb. Vi har bygget kommandolinjeverktøy på Toppen av Scheduler API for å gjøre operasjoner enkle, for eksempel pause en gruppe jobber på en gang.
  3. WEBGRENSESNITT. Det er en enkelt side app snakker Til Scheduler API. Vi brukte Ryggrad.Js Og Bootstrap å implementere Web UI. Menneskelige operatører primært bruke Web UI til å samhandle Med Nextdoor Scheduler.

Informasjon om alle jobber og jobbutførelser lagres i et datalager. Vi bruker Postgres primært her På Nextdoor.

Web UI

Ingeniører elsker Web UI Av Nextdoor Scheduler, som gir en intuitiv måte å administrere jobber i stedet for å håndtere blackbox-lignende Cron i gamle dager.

Jobbside

På denne siden kan vi se hvilke jobber vi har og når de skal løpe neste gang. Vi kan også klikke «Custom Run» for å manuelt sparke en jobb.

Redigere En Jobb

vi kan enkelt redigere en jobb, for eksempel endre tidsplanen og pause den med ett knappeklikk! Dette er mye bedre enn å endre ren tekst crontab i gamle dager.

Henrettelser Side

Til slutt har vi stor synlighet for hvilke jobber som kjører og om de lykkes eller ikke.

Rulle ut

Skrive kode er enkelt. Produksjon er vanskelig. Da vi var ferdig med implementeringen Av Nextdoor Scheduler, hadde vi nær 200 produksjon Cron jobber som må migrere til det nye systemet.

vi brukte det vi har lært fra Taskworker-prosjektet for å rulle Ut Nextdoor Scheduler-systemet. Fire trinn:

  1. Vi dark lanserte Nextdoor Scheduler til produksjon – ingen produksjonsjobber kjørte med det nye systemet ennå.
  2. vi har lagt til en funksjonsbryter til grunnklassen for alle jobber.
  3. vi sakte og forsiktig slått på funksjonsbrytere for hver jobb over to uker.
  4. vi slår av den gamle tykke planleggeren som kjørte Cron.

Happy Ending

med den nye Nextdoor Scheduler kan vi kjøre en mye billigere scheduler EC2-forekomst (c3.2XLARGE) enn før (c3.8xlarge), mens vi holder lasten super lav når vi avlaster jobber for å kjøre på distribuerte taskworker-maskiner.

Her ER CPU-brukssammenligningen mellom gammel planleggingsmaskin (toppgraf) og ny planleggingsmaskin (bunngraf):

Vi har brukt Planleggingsjobber i over 18 måneder. Vi er glade så langt. Hvis du er interessert i å jobbe med slike problemer og andre interessante infrastrukturutfordringer, ansetter vi!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.