vi kører ikke Cron-job på Nestdoor

baggrund

på Nestdoor kører vi mange planlagte job til forskellige vigtige formål, såsom at sende titusindvis af digest-e-mails til vores brugere dagligt, generere interne rapporter om vores vækst og nogle operationelle opgaver. Airbnb og kvora) startede vi med Cron og endte med at opbygge vores egen cron-udskiftning, som vi kaldte næste Dørplanlægger.

vi har brugt næste dør Scheduler i over 18 måneder, og vi er meget tilfredse med det.

så hvad er problemet med Cron?

der er fire hovedproblemer med Cron.

for det første var den måde, vi bruger Cron på, ikke skalerbar. Vi kørte alle Cron job på en velnæret scheduler maskine (c3.8store). Da vi fik trækkraft, skubbede Cron jobs maskinen til sin grænse med hensyn til beregning af ressourceforbrug.

for det andet er redigering af almindelig tekst crontab fejl tilbøjelig til at styre job, f.eks. For eksempel forhindrede en ekstra stjerne alle produktionsjob i at køre den anden dag:

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

tredje, vi afholdt en masse operationelle overhead med Cron. Vi har næsten to hundrede produktionsjob, der køres tusinder af gange om dagen, med forskellig frekvens (f.eks. Jobfejl er almindeligt. Oncall-personen måtte manuelt genstarte mislykkede job flere gange om dagen, nogle gange efter midnat. Her er et eksempel på en typisk oncall-oplevelse: 1) Bliv siddet med kommandolinjen for det mislykkede job; 2) ssh i planlægningsmaskinen; 3) Kopier & indsæt kommandolinjen for at køre det mislykkede job igen. Dette er bestemt ikke godt for teknisk lykke — Ja, vi bryr os om vores medarbejders lykke!

for det fjerde havde vi ringe synlighed for produktionsjob i løbet af driftstiden. Der var ikke let måde at vide, hvilke job der kørte, eller om de lykkedes.

beslutning

nok er nok. Vi besluttede at bygge en cron-udskiftning. Men hvorfor bruger vi ikke open source-løsninger? Vi kunne bare ikke finde en passende. Vi taler python. Vi ønskede at udnytte eksisterende infrastrukturkomponenter i virksomheden. Vi ønskede at bygge det, forstå det og eje det.

for at løse skalerbarhedsproblemet gjorde vi hvert job til en async-opgave, der kan køre på en klynge af Opgavearbejdermaskiner. Vi kan nemt konfigurere job, der kører på Opgavearbejder, til automatisk at prøve igen, når de mislykkes, hvilket kun kræver en enkelt linjekodeændring. Vores oncall ingeniører elsker denne auto-prøv igen funktion!

for at erstatte Cron brugte vi det fremragende python — modul ApScheduler til at planlægge job, hvilket gjorde det muligt for os at styre job programmatisk.

arkitektur

følgende billede viser arkitekturen i vores planlægningssystem.

næste dør Scheduler er implementeret med Python / Tornado. Det køres som en enkelt dæmon proces (Scheduler proces) på en enkelt maskine, som består af tre komponenter.

  1. Scheduler (eller Core Scheduler). Det erstatter cron og tidsplaner job til at køre. Når et job udløses til at køre, offentliggør planlægningsprocessen simpelthen en meddelelse til jobbet. En klynge af Taskarbejdermaskiner griber beskeder fra og kører tilsvarende job. Som nævnt ovenfor bruger vi APScheduler til at implementere core scheduler.
  2. Scheduler API. Det giver en REST-grænseflade til at styre job, f.eks. tilføje job, pause/genoptage et job, fjerne job, ændre job og manuelt starte et job. Vi har bygget kommandolinjeværktøjer oven på Scheduler API for at gøre operationer nemme, for eksempel at sætte en gruppe job på pause på en gang.
  3. internet UI. Det er en enkelt side app taler til Scheduler API. Vi brugte Backbone.JS og Bootstrap til at implementere internettet UI. Menneskelige operatører bruger primært internettet UI til at interagere med næste dør Scheduler.

oplysninger om alle job og jobudførelser gemmes i et datalager. Vi bruger Postgres primært her på Næste dør.

Internet UI

ingeniører elsker internet UI af næste dør Scheduler, som giver en intuitiv måde at styre job i stedet for at håndtere sort boks-lignende Cron i gamle dage.

job side

på denne side kan vi se, hvilke job vi har, og hvornår de kører næste gang. Vi kan også klikke på” Custom Run ” for manuelt at starte et job.

redigering af et Job

vi kan nemt redigere et job, f. eks. ændre sin tidsplan og pause det med en knap klik! Dette er langt bedre end at ændre almindelig tekst crontab i gamle dage.

henrettelser side

endelig har vi stor synlighed for, hvilke job der kører, og om de lykkes eller ej.

udrulning

skrivning af kode er let. Produktion er svært. Da vi var færdige med implementeringen af næste Dørplanlægger, havde vi tæt på 200 produktionskronjob, der skal migrere til det nye system.

vi anvendte det, vi har lært af Opgavearbejderprojektet, til at udrulle det næste Dørplanlægningssystem. Fire trin:

  1. vi mørke lanceret næste dør Scheduler til produktion-ingen produktion job kørte med det nye system endnu.
  2. vi tilføjede en Funktionskontakt til basisklassen for alle job.
  3. vi tændte langsomt og omhyggeligt funktionskontakter for hvert job over to uger.
  4. vi lukker den gamle kødfulde planlægningsmaskine, der kørte Cron.

Happy Ending

med den nye næste Dørplanlægger er vi i stand til at køre en meget billigere scheduler EC2-instans (c3.2stor) end før (c3.8stor), samtidig med at belastningen holdes super lav, da vi aflaster job til at køre på distribuerede Opgavearbejdermaskiner.

her er CPU-forbrug sammenligning mellem gamle scheduler maskine (øverste graf) og ny scheduler maskine (nederste graf):

vi har brugt Scheduler job i over 18 måneder. Vi er glade indtil videre. Hvis du er interesseret i at arbejde på denne slags problemer og andre interessante infrastrukturudfordringer, ansætter vi!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.