Zdefiniuj jedną jednostkę użytecznej pracy
Dla wewnętrznego eksportu CSV żądanie tworzy rekord eksportu; worker odczytuje ograniczony zbiór danych, zapisuje obiekt wyjściowy i oznacza rekord jako ukończony. Zdefiniuj maksymalny użyteczny zakres, limit czasu i zachowanie przy anulowaniu. Użyj odizolowanej kolejki, bazy danych testowej i miejsca docelowego, które nie może powiadomić prawdziwych klientów.
Oddziel czas obliczeń od oczekiwania na bazę danych i pamięć masową. Jedna liczba czasu trwania zadania ukrywa te różnice. Budowanie całego pliku w pamięci skaluje się inaczej niż strumieniowanie ograniczonych partii. Utrzymuj komunikat kolejki na tyle mały, aby opisywał pracę, bez osadzania danych klienta lub poświadczeń.
Zapewnij z założenia bezpieczeństwo powtarzalnego dostarczania
Użyj trwałego identyfikatora eksportu, aby powiązać próby z jednym logicznym wynikiem. Wymuś unikalność i atomowe przejście własności/ukończenia w trwałym stanie. Sprawdzanie, czy eksport istnieje, a następnie wstawianie w osobnym niechronionym kroku, pozwala równoczesnym próbom na wyścig. Publikowanie obiektu i potwierdzanie komunikatu kolejki również tworzą granicę awarii.
# Illustrative contract, not queue implementation
job_type: export-account-report
logical_result: EXPORT_RECORD_ID
input_scope: AUTHORIZED_ACCOUNT_AND_DATE_RANGE
attempt_limit: REVIEWED_FINITE_LIMIT
completion: ONE_PUBLISHED_RESULT_FOR_THIS_EXPORT
retry: CLASSIFIED_TRANSIENT_FAILURES_ONLY
failed_result: INSPECTABLE_WITHOUT_CUSTOMER_SECRETSCelery łączy późne potwierdzenie z idempotentnymi zadaniami i dokumentuje przypadki, w których potwierdzenie nadal następuje po zakończeniu procesu potomnego. Opcja kolejki nie tworzy wykonania dokładnie raz. Sprawdź semantykę ponownego dostarczania w swoim systemie i zaprojektuj wynik aplikacji tak, aby tolerował ponowienia.
Dokumentacja techniczna: Zachowanie zadań Celery.
Ustaw budżet przed zwiększeniem liczby procesów
Dla hipotetycznego workera używającego 300 MiB na aktywny eksport cztery równoczesne eksporty już implikują około 1,200 MiB przed narzutem środowiska uruchomieniowego. To dane wejściowe do planowania, nie benchmarki. Dodaj połączenia do bazy danych, pamięć zapytań, dysk tymczasowy i przepustowość wyjściową; liczba procesów to tylko jeden limit.
Przeprowadź próbę z jednym aktywnym eksportem i realistycznym zaległościami. Zwiększ do dwóch, powtarzając ten sam ruch API. Porównaj ukończone użyteczne eksporty, wiek najstarszego zadania, opóźnienia, błędy i obciążenie hosta. Jeśli przepustowość ledwo się poprawia, a oczekiwania na bazę danych rosną, przestań zwiększać współbieżność. Dodatkowy CPU może nie usunąć tego wąskiego gardła.
Powstrzymaj awarie przed tworzeniem większego obciążenia
Klasyfikuj błędy przed ponowieniem. Tymczasowa awaria pamięci masowej może być przejściowa; nieautoryzowane konto lub nieobsługiwany format eksportu wymaga błędu terminalnego lub interwencji. Użyj skończonego budżetu prób i opóźnionych ponowień z backoffem i jitterem, jeśli są obsługiwane. Utrzymuj nieudane zadania możliwe do sprawdzenia po usunięciu wrażliwych pól.
Zastosuj limity czasu do wywołań zewnętrznych i ogólny budżet zadania. Rezygnacja z próby nie dowodzi, że jej zdalny efekt uboczny nie wystąpił. Publikacja, która przekroczyła limit czasu, mogła już zapisać wynik. Uzgodnij stan według identyfikatora eksportu, zamiast publikować kolejny wynik na ślepo.
Uwzględnij workery w wdrożeniu i odtwarzaniu
Zatrzymaj nowe zadania na starym workerze, korzystając z jego udokumentowanego sposobu zamykania. Pozwól zakończyć się zadaniom w toku lub przerwij je bezpiecznie w znanym terminie. Przetestuj awarię po zapisaniu wyniku, ale przed zapisaniem ukończenia; próba zastępcza powinna znaleźć spójny wynik, a nie go zduplikować.
Utrzymuj zgodność formatów komunikatów między nakładającymi się wydaniami. Nowy interfejs API może umieścić w kolejce ładunek, którego stary worker nie odczyta. Wersjonuj kontrakt lub zaplanuj wdrożenie tak, aby obsługiwani odbiorcy istnieli, zanim pojawią się nowe komunikaty. Uwzględnij tych autorów zapisów do bazy danych w przeglądzie zgodności schematu.
Wybierz następne ograniczenie do zmiany
Pozostaw ustawienie współbieżności, politykę ponawiania, kontrakt zadania i zmierzoną regułę zatrzymania. Jeśli kosztowne eksporty opóźniają małe zadania, rozważ osobne kolejki z niezależnymi budżetami, zanim podniesiesz globalny limit. Jeśli opóźnienie API cierpi przy każdym realistycznym obciążeniu eksportem, rozdzielenie workerów może być bardziej użyteczne niż powiększanie jednego współdzielonego hosta.
Powtórz to samo obciążenie po zmianie i zachowaj porównanie. scenariusz API i workerów wyjaśnia, gdzie App 2 i dodatkowa pamięć wchodzą w wybór. Te procedury nie oznaczają zarządzanej kolejki, nieograniczonej liczby zadań ani automatycznego skalowania.
Oficjalne odniesienia
Dokumentacja została zweryfikowana dla tego artykułu. Przykłady są ćwiczeniami planistycznymi, a nie poleceniami przetestowanymi na serwerze PrivacyNodes. Sprawdź dokumentację dla swojej zainstalowanej wersji.