vi kör inte Cron-jobb på Nextdoor

Bakgrund

på Nextdoor kör vi många schemalagda jobb för olika viktiga ändamål, som att skicka tiotals miljoner digest-e-postmeddelanden till våra användare dagligen, generera interna rapporter om vår tillväxt och vissa operativa uppgifter. Liksom många andra internetföretag (t.ex. Airbnb och Quora) började vi med Cron och slutade bygga vår egen cron-ersättning, som vi kallade Nextdoor Scheduler.

vi har använt Nextdoor Scheduler i över 18 månader och vi är mycket nöjda med det.

så, vad är problemet med Cron?

det finns fyra huvudproblem med Cron.

för det första var sättet vi använder Cron inte skalbart. Vi körde alla Cron jobb på en biffig schemaläggare maskin (c3.8xlarge). När vi fick dragkraft pressade Cron jobs maskinen till sin gräns när det gäller beräkningsresursanvändning.

för det andra är redigering av vanlig text crontab felaktigt för att hantera jobb, t.ex. lägga till jobb, ta bort jobb eller pausa jobb. Till exempel, en extra asterisk hindrade alla produktionsjobb från att köra häromdagen:

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

för det tredje har vi haft en hel del operativa kostnader med Cron. Vi har nära två hundra produktionsjobb som körs tusentals gånger om dagen, med olika frekvens (t.ex. minutiellt, timme, vecka). Jobbfel är vanligt. Oncall-personen var tvungen att manuellt starta om misslyckade jobb flera gånger om dagen, ibland efter midnatt. Här är ett exempel på en typisk oncall-upplevelse: 1) Få paged med kommandoraden för det misslyckade jobbet; 2) ssh i scheduler-maskinen; 3) Kopiera & klistra in kommandoraden för att köra om det misslyckade jobbet. Detta är verkligen inte bra för teknisk lycka-Ja, Vi bryr oss om våra anställdas lycka!

för det fjärde hade vi liten synlighet för produktionsjobb under körning. Det fanns inte ett enkelt sätt att veta vilka jobb som körde eller om de lyckades.

beslut

nog är nog. Vi bestämde oss för att bygga en cron-ersättning. Varför använder vi inte open source-lösningar? Vi kunde bara inte hitta en lämplig. Vi pratar python. Vi ville utnyttja befintliga infrastrukturkomponenter i företaget. Vi ville bygga det, förstå det och äga det.

för att ta itu med skalbarhetsproblemet gjorde vi varje jobb till en async-uppgift som kan köras på ett kluster av Taskworker-maskiner. Vi kan enkelt konfigurera jobb som körs på Taskworker för att automatiskt försöka igen när de misslyckas, vilket bara kräver en enda radkodändring. Våra OnCall-ingenjörer älskar denna auto-retry-funktion!

för att ersätta Cron använde vi den utmärkta python — modulen ApScheduler för att schemalägga jobb, vilket gjorde det möjligt för oss att hantera jobb programmatiskt-vi byggde REST API: er, kommandoradsverktyg och mänskligt vänligt webbgränssnitt.

arkitektur

följande bild visar arkitekturen i vårt schemaläggningssystem.

Nextdoor Scheduler implementeras med Python / Tornado. Den körs som en enda demonprocess (Scheduler Process) på en enda maskin, som består av tre komponenter.

  1. schemaläggare (eller Core Scheduler). Den ersätter cron och scheman jobb att köra. När ett jobb utlöses för att köra, publicerar Schemaläggningsprocessen helt enkelt ett meddelande för jobbet till Amazon SQS. Ett kluster av Taskworker-maskiner tar tag i meddelanden från Amazon SQS och kör motsvarande jobb. Som nämnts ovan använder vi APScheduler för att implementera core scheduler.
  2. schemaläggare API. Det ger ett REST-gränssnitt för att hantera jobb, t.ex. lägga till jobb, pausa/återuppta ett jobb, ta bort jobb, ändra jobb och manuellt starta ett jobb. Vi har byggt kommandoradsverktyg ovanpå Scheduler API för att göra operationer enkla, till exempel pausa en grupp jobb på en gång.
  3. webbgränssnitt. Det är en enda sida app talar till Scheduler API. Vi använde Backbone.js och Bootstrap för att implementera webbgränssnittet. Mänskliga operatörer använder främst webbgränssnittet för att interagera med Nextdoor Scheduler.

Information om alla jobb och jobb avrättningar lagras i ett datalager. Vi använder Postgres främst här på Nextdoor.

webbgränssnitt

ingenjörer älskar webbgränssnittet för Nextdoor Scheduler, vilket ger ett intuitivt sätt att hantera jobb snarare än att hantera blackbox-liknande Cron i gamla dagar.

jobbsida

på den här sidan kan vi se vilka jobb vi har och när de kommer att köras nästa gång. Vi kan också klicka på” Anpassad körning ” för att manuellt starta ett jobb.

redigera ett jobb

vi kan enkelt redigera ett jobb, t. ex. ändra sitt schema och pausa det med ett knapptryck! Detta är mycket bättre än att ändra vanlig text crontab i gamla dagar.

sidan avrättningar

Slutligen har vi stor synlighet för vilka jobb som körs och om de lyckas eller inte.

rulla ut

skriva kod är lätt. Produktion är svårt. När vi avslutade implementeringen av Nextdoor Scheduler hade vi nära 200 produktion Cron jobb som behöver migrera till det nya systemet.

vi tillämpade vad vi har lärt oss från Taskworker-projektet för att rulla ut Nextdoor Scheduler-systemet. Fyra steg:

  1. We dark lanserade Nextdoor Scheduler till produktion-inga produktionsjobb kördes med det nya systemet ännu.
  2. vi lade till en Funktionsbrytare till basklassen för alla jobb.
  3. vi slog långsamt och försiktigt på Funktionsbrytare för varje jobb under två veckor.
  4. vi stängde av den gamla biffiga Schemaläggaren som körde Cron.

lyckligt slut

med den nya Nextdoor Scheduler kan vi köra en mycket billigare Scheduler EC2-instans (c3.2xlarge) än tidigare (c3.8xlarge), samtidigt som vi håller lasten super låg när vi avlastar jobb för att köra på distribuerade Taskworker-maskiner.

här är CPU-användningsjämförelsen mellan gammal schemaläggningsmaskin (toppdiagram) och ny schemaläggningsmaskin (bottendiagram):

vi har använt Schemaläggningsjobb i över 18 månader. Vi är glada hittills. Om du är intresserad av att arbeta med den här typen av problem och andra intressanta infrastrukturutmaningar, anställer vi!

Lämna ett svar

Din e-postadress kommer inte publiceras.