nie uruchamiamy Zadań Cron w Nextdoor

kontekst

w Nextdoor wykonujemy wiele zaplanowanych zadań dla różnych ważnych celów, takich jak codzienne wysyłanie dziesiątek milionów e-maili do naszych użytkowników, generowanie wewnętrznych raportów o naszym wzroście i niektóre zadania operacyjne. Airbnb I Quora), zaczęliśmy od crona, a skończyło się na budowaniu własnego zamiennika crona, który nazwaliśmy Nextdoor Scheduler.

korzystamy z Nextdoor Scheduler od ponad 18 miesięcy i jesteśmy z niego bardzo zadowoleni.

więc jaki jest problem z Cronem?

istnieją cztery główne problemy z Cronem.

po pierwsze, sposób, w jaki używamy crona, nie był skalowalny. Uruchomiliśmy wszystkie zadania Cron na silnej maszynie scheduler (c3. 8xlarge). Gdy zyskaliśmy przyczepność, Zadania Cron zepchnęły maszynę do granic możliwości, jeśli chodzi o zużycie zasobów obliczeniowych.

po drugie, edytowanie zwykłego tekstu crontab jest podatne na błędy w zarządzaniu zadaniami, np. dodawaniem zadań, usuwaniem zadań lub wstrzymywaniem zadań. Na przykład dodatkowa gwiazdka uniemożliwiła uruchomienie wszystkich zadań produkcyjnych:

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

Po Trzecie, ponosiliśmy wiele kosztów operacyjnych dzięki Cron. Mamy blisko dwieście prac produkcyjnych, które są uruchamiane tysiące razy dziennie, z różną częstotliwością (np. minutowo, co godzinę, co tydzień). Niepowodzenie w pracy jest powszechne. Osoba oncall musiała ręcznie restartować nieudane zadania kilka razy dziennie, czasami po północy. Oto przykład typowego doświadczenia oncall: 1) get paged with the command line of the failed job; 2) ssh into the scheduler machine; 3) copy & paste the command line to rerun the failed job. Z pewnością nie jest to dobre dla inżynieryjnego szczęścia-tak, zależy nam na szczęściu naszych pracowników!

Po czwarte, mieliśmy niewielką widoczność zadań produkcyjnych podczas pracy. Nie było łatwego sposobu, aby dowiedzieć się, jakie prace były prowadzone lub czy im się udało.

decyzja

wystarczy. Zdecydowaliśmy się zbudować zamiennik cron. Ale dlaczego nie korzystaliśmy z rozwiązań open source? Nie mogliśmy znaleźć odpowiedniego. Mówimy po Pythonie. Chcieliśmy wykorzystać istniejące komponenty infrastruktury w firmie. Chcieliśmy go zbudować, zrozumieć i posiadać.

aby rozwiązać problem skalowalności, każde zadanie wykonaliśmy jako zadanie asynchroniczne, które można uruchomić na klastrze maszyn Taskworker. Możemy łatwo skonfigurować zadania uruchomione na Taskworker, aby automatycznie ponawiały próbę, gdy się nie powiedzie, co wymaga tylko jednej zmiany kodu linii. Nasi inżynierowie OnCall uwielbiają tę funkcję auto-retry!

aby zastąpić crona, użyliśmy doskonałego modułu python ApScheduler do planowania zadań, co pozwoliło nam programowo zarządzać zadaniami-zbudowaliśmy interfejsy API REST, narzędzia wiersza poleceń i przyjazny dla człowieka interfejs WWW.

Architektura

poniższy rysunek przedstawia architekturę naszego systemu harmonogramów.

Nextdoor Scheduler jest zaimplementowany w Python / Tornado. Jest uruchamiany jako pojedynczy proces demona (proces Schedulera) na jednej maszynie, która składa się z trzech komponentów.

  1. Scheduler (lub Core Scheduler). Zastępuje cron i harmonogramy zadań do uruchomienia. Gdy zadanie jest wyzwalane do uruchomienia, proces harmonogramu po prostu publikuje wiadomość dla zadania do Amazon SQS. Klaster maszyn Taskworker chwyta wiadomości z Amazon SQS i uruchamia odpowiednie zadania. Jak wspomniano powyżej, używamy APScheduler do implementacji core scheduler.
  2. Zapewnia interfejs REST do zarządzania zadaniami, np. dodawania zadań, wstrzymywania/wznawiania zadania, usuwania zadań, modyfikowania zadań i ręcznego kopiowania zadania. Zbudowaliśmy narzędzia wiersza poleceń w oparciu o API Scheduler, aby ułatwić operacje, na przykład wstrzymywanie wszystkich zadań jednocześnie.
  3. Web UI. Jest to aplikacja pojedyncza strona rozmowy z API Scheduler. Użyliśmy szkieletu.js i Bootstrap do implementacji interfejsu WWW. Ludzie używają głównie interfejsu WWW do interakcji z Nextdoor Scheduler.

informacje o wszystkich zadaniach i wykonaniach zadań są przechowywane w magazynie danych. Używamy Postgres głównie tutaj w Nextdoor.

Web UI

Inżynierowie uwielbiają Web UI Nextdoor Scheduler, który zapewnia intuicyjny sposób zarządzania zadaniami, a nie radzenia sobie z Cronem podobnym do blackboxa w dawnych czasach.

strona z ofertami pracy

na tej stronie możemy zobaczyć, jakie mamy zadania i kiedy będą działać następnym razem. Możemy również kliknąć „Custom Run”, aby ręcznie rozpocząć pracę.

edytowanie zadania

możemy łatwo edytować zadanie, np. zmienić jego harmonogram i wstrzymać je jednym kliknięciem! Jest to o wiele lepsze niż modyfikowanie zwykłego tekstu crontab w dawnych czasach.

wreszcie, mamy doskonałą widoczność dla tego, jakie zadania są uruchomione i czy odnoszą sukces, czy nie.

rozwijanie

pisanie kodu jest łatwe. Produkcja jest trudna. Do czasu zakończenia wdrożenia Nextdoor Scheduler mieliśmy blisko 200 zadań cron produkcyjnych, które musiały przejść do nowego systemu.

zastosowaliśmy to, czego nauczyliśmy się z projektu Taskworker, aby wdrożyć system harmonogramu Nextdoor. Cztery kroki:

  1. uruchomiliśmy Nextdoor Scheduler do produkcji-z nowym systemem nie były jeszcze uruchomione żadne zadania produkcyjne.
  2. dodaliśmy przełącznik funkcji do podstawowej klasy wszystkich zadań.
  3. powoli i ostrożnie włączaliśmy przełączniki funkcji dla każdego zadania w ciągu dwóch tygodni.
  4. zamknęliśmy starą maszynę do planowania, która uruchamiała crona.

Happy Ending

dzięki nowemu Schedulerowi Nextdoor jesteśmy w stanie uruchomić znacznie tańszą instancję schedulera EC2 (c3.2xlarge) niż poprzednio (c3.8xlarge), jednocześnie utrzymując bardzo niskie obciążenie podczas rozładowywania zadań na rozproszonych maszynach Taskworker.

oto porównanie użycia procesora między starą maszyną scheduler (górny wykres) i nową maszyną scheduler (dolny Wykres):

korzystamy z usług Schedulera od ponad 18 miesięcy. Jak na razie jesteśmy szczęśliwi. Jeśli jesteś zainteresowany pracą nad tego rodzaju problemami i innymi ciekawymi wyzwaniami infrastrukturalnymi, zatrudniamy!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.