Spakuj workera
Użyj obsługiwanego środowiska uruchomieniowego, przypiętych zależności i menedżera usług lub kontenera. Skonfiguruj limity restartów i dedykowanego użytkownika usługi. Przechowuj prywatne dane uwierzytelniające dostawcy w chronionej konfiguracji poza publicznymi plikami aplikacji.
Zapisz postępy, zanim działania będą miały znaczenie
Używaj trwałej kolejki lub bazy danych dla zadań. Przypisz unikalny identyfikator operacji, rejestruj żądania zewnętrzne i uzgadniaj niepewne wyniki. Ponowne uruchomienie nie powinno wysłać drugiego e-maila, utworzyć drugiego zamówienia ani obciążyć dwa razy.
Dodaj przydatną obserwowalność
Monitoruj ukończenie zadań, wiek kolejki, wskaźnik błędów i koszt, zamiast sprawdzać tylko, czy proces istnieje. Utrzymuj dzienniki na tyle małe, by można je było przeglądać, i redaguj tokeny, prompty i dokumenty, których nie trzeba przechowywać.
Ustaw wyraźny limit
Ogranicz wydatki na model, współbieżność przeglądarki, czas działania i liczbę ponowień. Utrzymuj łatwy przełącznik pauzy i ścieżkę przeglądu przez człowieka dla działań o istotnych skutkach. Mniejszy, dobrze obserwowany worker jest łatwiejszy do zaufania niż nieograniczony.
Użyj supervisora i przemyślanego harmonogramu
Systemd i Docker to typowe sposoby na utrzymanie procesu po rozłączeniu terminala. Dla usługi systemd Type=exec może zgłaszać błąd wykonania bezpośredniej niż proste uruchomienie w tle, a Restart=on-failure może ponownie uruchamiać błędy według ograniczonej polityki. Zadania zaplanowane powinny unikać nakładających się uruchomień. Ustaw jawnie katalog roboczy, użytkownika usługi i środowisko. Przykład zakłada, że użytkownik koala-agent, środowisko wirtualne, moduł workera i prywatny plik środowiska już istnieją; dostosuj je przed zainstalowaniem jednostki.
- Użyj dedykowanego konta usługi
- Ustaw opóźnienie restartu i limit awarii
- Sprawdź poprzedni stan zadania przed rozpoczęciem zaplanowanego uruchomienia
[Unit]
Description=Example agent worker
After=network-online.target
[Service]
Type=exec
User=koala-agent
WorkingDirectory=/opt/koala-agent
EnvironmentFile=/etc/koala-agent.env
ExecStart=/opt/koala-agent/.venv/bin/python -m worker
Restart=on-failure
RestartSec=10
NoNewPrivileges=true
[Install]
WantedBy=multi-user.targetOficjalna dokumentacja: Semantyka usługi systemd
Ustaw dzienny budżet i granicę duplikatów
Ustaw dla procesu roboczego maksymalną liczbę żądań, limit wydatków i limit czasu wykonania. Używaj trwałego rekordu idempotencji dla działań wpływających na świat zewnętrzny. Udane kliknięcie w przeglądarce może nastąpić, zanim proces otrzyma odpowiedź; sprawdź stan zewnętrzny przed ponowną próbą. Montowanie sekretów w Docker Compose może utrzymać sekret poza obrazem, ale uprawnienia i aplikacja korzystająca z sekretu nadal wymagają przeglądu.
Oficjalna dokumentacja: Sekrety Docker Compose
Nadaj zadaniu cyklicznemu jawną politykę nadrabiania zaległości
Użyj długotrwałej usługi dla trwałego procesu roboczego kolejki oraz usługi oneshot wyzwalanej timerem dla ograniczonego zadania zaplanowanego. W przypadku timera kalendarzowego systemd Persistent=true może wyzwolić jedno pominięte uruchomienie po przestoju; nie odtwarza całego zaległego zakresu zadań biznesowych. Zdecyduj, czy takie nadrobienie jest pożądane. RandomizedDelaySec może rozłożyć starty, a dzierżawa na poziomie aplikacji zapobiega przetwarzaniu tego samego zaplanowanego zadania przez dwie repliki.
- Zapisz zamierzoną strefę czasową i sprawdź następne czasy uruchomienia przed włączeniem harmonogramu.
- Ustaw termin wykonania zadania krótszy niż interwał, który nie może się nakładać, albo użyj trwałej dzierżawy z wygaśnięciem i własnością.
- Zadanie powinno wybierać zaległą pracę z zapisanego stanu, zamiast zakładać, że każde poprzednie zdarzenie timera zostało wykonane.
- Sprawdź zainstalowaną wersję systemd przed użyciem dyrektywy z najnowszego podręcznika.
# Read-only checks after creating your own matching units.
systemctl list-timers --all
systemctl status koala-agent.service
journalctl -u koala-agent.service --since today --no-pagerOficjalna dokumentacja: systemd: harmonogram zadań
Odróżnij pętlę awarii od zatrzymanego workera
Polityka restartów może odzyskać nieudany proces, ale powtarzanie nieprawidłowych danych uwierzytelniających lub zepsutej migracji co kilka sekund czyni błąd głośniejszym. Ogranicz uruchomienia usługi i alarmuj przy powtarzających się błędach. Działający proces może też być zawieszony: mierz wiek najstarszego zadania i ostatniej ukończonej operacji. Przetestuj awarię API, pusty dysk i zatrzymanie procesu za pomocą jednorazowych zadań, a następnie sprawdź, czy trwały stan zapobiega duplikowaniu działań zewnętrznych.
- Ustaw budżet dostawcy i limit czasu żądania w aplikacji, a także granicę CPU/pamięci w środowisku uruchomieniowym.
- Kontenery Docker nie mają użytecznego limitu pamięci specyficznego dla obciążenia tylko dlatego, że są kontenerami; skonfiguruj i przetestuj limity celowo.
- Przechowuj sekret poza obrazem i publicznym drzewem, a następnie sprawdź, czy logi awarii i diagnostyka go redagują.
- Zachowaj ręczną drogę zatrzymania i wymagaj odpowiedniego przeglądu dla wydatków, zapisów produkcyjnych lub wiadomości zewnętrznych.
Oficjalna dokumentacja: systemd: nadzór nad usługami · Docker: ograniczenia zasobów kontenera