noi nu rula locuri de muncă Cron la Nextdoor

fundal

la Nextdoor, vom rula o mulțime de locuri de muncă programate pentru diverse scopuri importante, cum ar fi trimiterea de zeci de milioane de e-mailuri digest utilizatorilor noștri de zi cu zi, generarea de rapoarte interne cu privire la creșterea noastră, și unele sarcini operaționale. La fel ca multe alte companii de internet (de exemplu, Airbnb și Quora), am început cu Cron și am ajuns să construim propriul nostru înlocuitor cron, pe care l-am numit Nextdoor Scheduler.

folosim Nextdoor Scheduler de peste 18 luni și suntem extrem de mulțumiți de asta.

Deci, care este problema cu Cron?

există patru probleme principale cu Cron.

în primul rând, modul în care folosim Cron nu a fost scalabil. Am fugit toate locurile de muncă Cron pe o mașină Scheduler musculos (c3.8xlarge). Pe măsură ce am câștigat tracțiune, Cron jobs a împins mașina la limita sa, în ceea ce privește utilizarea resurselor de calcul.

în al doilea rând, editarea textului simplu crontab este predispusă la erori pentru gestionarea lucrărilor, de exemplu, adăugarea lucrărilor, ștergerea lucrărilor sau întreruperea lucrărilor. De exemplu, un asterisc suplimentar a împiedicat toate lucrările de producție să funcționeze zilele trecute:

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

în al treilea rând, am suportat o mulțime de cheltuieli operaționale cu Cron. Avem aproape două sute de locuri de muncă de producție care sunt rulate de mii de ori pe zi, la frecvențe diferite (de exemplu, minuțios, orar, săptămânal). Eșecul locului de muncă este comun. Persoana oncall a trebuit să repornească manual lucrările eșuate de mai multe ori pe zi, uneori după miezul nopții. Iată un exemplu de experiență tipică oncall: 1) Obțineți paginarea cu linia de comandă a lucrării eșuate; 2) ssh în mașina de planificare; 3) Copiați & lipiți linia de comandă pentru a relua lucrarea eșuată. Acest lucru nu este cu siguranță bun pentru fericirea inginerească-da, ne pasă de fericirea angajaților noștri!

în al patrulea rând, am avut o vizibilitate redusă pentru locurile de muncă din producție în timpul rulării. Nu a fost o modalitate ușoară de a ști ce locuri de muncă au fost difuzate sau dacă au reușit.

decizie

suficient este suficient. Am decis să construim un înlocuitor cron. Dar de ce nu am folosit soluții open source? Pur și simplu nu am putut găsi unul potrivit. Vorbim python. Am vrut să valorificăm componentele de infrastructură existente în companie. Am vrut să-l construim, să-l înțelegem și să-l deținem.

pentru a rezolva problema scalabilității, am făcut din fiecare lucrare o activitate asincronă care poate rula pe un cluster de mașini Taskworker. Putem configura cu ușurință lucrările care rulează pe Taskworker pentru a încerca din nou automat atunci când nu reușesc, ceea ce necesită doar o singură modificare a codului de linie. Inginerii noștri oncall adoră această caracteristică de reîncercare automată!

pentru a înlocui Cron, am folosit excelentul modul python ApScheduler pentru a programa locuri de muncă, ceea ce ne — a permis să gestionăm locurile de muncă programatic-am construit API-uri REST, instrumente de linie de comandă și UI Web prietenos cu oamenii.

Arhitectură

următoarea imagine prezintă arhitectura sistemului nostru de planificare.

Nextdoor Scheduler este implementat cu Python / Tornado. Acesta este rulat ca un singur proces daemon (Planificator proces) pe o singură mașină, care constă din trei componente.

  1. Scheduler (sau Scheduler de bază). Acesta înlocuiește cron și programe de locuri de muncă pentru a rula. Atunci când un loc de muncă este declanșat pentru a rula, procesul de Scheduler publică pur și simplu un mesaj pentru locuri de muncă la Amazon SQS. Un grup de mașini Taskworker apuca mesaje de la Amazon SQS și a alerga de locuri de muncă corespunzătoare. După cum sa menționat mai sus, vom folosi APScheduler să pună în aplicare core scheduler.
  2. Scheduler API. Acesta oferă o interfață REST pentru a gestiona locuri de muncă, de exemplu, adăugarea de locuri de muncă, întreruperea/reluarea unui loc de muncă, eliminarea de locuri de muncă, Modificarea de locuri de muncă, și manual lovind un loc de muncă. Am construit instrumente de linie de comandă pe partea de sus a Scheduler API pentru a face operațiunile ușor, de exemplu, întreruperea unui grup de locuri de muncă dintr-o dată.
  3. UI Web. Este o aplicație cu o singură pagină care vorbește cu Scheduler API. Am folosit coloana vertebrală.js și Bootstrap pentru a pune în aplicare UI Web. Operatorii umani folosesc în primul rând interfața web pentru a interacționa cu Nextdoor Scheduler.

informațiile despre toate lucrările și execuțiile lucrărilor sunt stocate într-un depozit de date. Noi folosim Postgres în primul rând aici, la Nextdoor.

web UI

inginerii iubesc web UI de Nextdoor Scheduler, care oferă o modalitate intuitivă de a gestiona locuri de muncă, mai degrabă decât de-a face cu Blackbox-ca Cron în zilele de demult.

locuri de munca

pe această pagină, putem vedea ce locuri de muncă avem și când vor rula data viitoare. De asemenea, putem face clic pe „Custom Run” pentru a lansa manual un loc de muncă.

editarea unui Job

putem edita cu ușurință un loc de muncă, de exemplu, schimba programul său și întrerupe-l cu un singur buton click! Acest lucru este mult mai bine decât modificarea text simplu crontab în zilele de demult.

pagina execuții

în cele din urmă, avem o mare vizibilitate pentru ce locuri de muncă funcționează și dacă reușesc sau nu.

lansarea

scrierea codului este ușoară. Producția este dificilă. Până când am terminat implementarea Nextdoor Scheduler, aveam aproape 200 de locuri de muncă de producție Cron care trebuie să migreze către noul sistem.

am aplicat ceea ce am învățat din proiectul Taskworker pentru a lansa sistemul Nextdoor Scheduler. Patru pași:

  1. am întuneric lansat Nextdoor Scheduler la producție — nici un loc de muncă de producție au fost difuzate cu noul sistem încă.
  2. am adăugat un comutator caracteristică la clasa de bază a tuturor locurilor de muncă.
  3. am pornit încet și cu atenție comutatoarele de funcții pentru fiecare lucrare pe parcursul a două săptămâni.
  4. am oprit vechea mașină Scheduler musculos care a fugit Cron.

final fericit

cu noul Nextdoor Scheduler, suntem capabili de a rula o instanță mult mai ieftin scheduler EC2 (c3.2xlarge) decât înainte (c3.8xlarge), păstrând în același timp sarcina super scăzut ca am descărca de locuri de muncă pentru a rula pe mașini Taskworker distribuite.

Iată comparația de utilizare a procesorului între vechea mașină de planificare (graficul de sus) și noua mașină de planificare (graficul de jos):

am fost folosind Locuri de muncă Scheduler de peste 18 luni. Suntem fericiți până acum. Dacă sunteți interesat să lucrați la aceste tipuri de probleme și alte provocări interesante de infrastructură, angajăm!

Lasă un răspuns

Adresa ta de email nu va fi publicată.