Împachetați workerul
Folosiți un runtime acceptat, dependențe fixate și un manager de servicii sau un container. Configurați limite de repornire și un utilizator de serviciu dedicat. Păstrați acreditările private ale furnizorului în configurația protejată, în afara fișierelor publice ale aplicației.
Salvează progresul înainte ca acțiunile să conteze
Folosiți o coadă durabilă sau o bază de date pentru sarcini. Atribuiți un identificator unic de operațiune, înregistrați cererile externe și reconciliați rezultatele incerte. O repornire nu ar trebui să trimită un al doilea e-mail, să creeze o a doua comandă sau să taxeze de două ori.
Adăugați observabilitate utilă
Monitorizați finalizarea sarcinilor, vechimea cozii, rata erorilor și costul, în loc să verificați doar dacă există un proces. Păstrați jurnalele suficient de mici pentru a fi revizuite și redactați tokenurile, prompturile și documentele care nu trebuie păstrate.
Stabiliți un plafon clar
Limitați cheltuielile cu modelul, concurența browserului, durata de rulare și numărul de reîncercări. Păstrați un comutator ușor de pauză și o cale de revizuire umană pentru acțiunile cu consecințe. Un worker mai mic și bine observat este mai ușor de încredere decât unul nerestricționat.
Utilizați un supervisor și un program deliberat
Systemd și Docker sunt modalități comune de a face un proces să supraviețuiască deconectării terminalului. Pentru un serviciu systemd, Type=exec poate raporta eșecul de execuție mai direct decât o simplă lansare în fundal, iar Restart=on-failure poate reporni eșecurile cu o politică limitată. Sarcinile programate ar trebui să evite rulările suprapuse. Păstrați explicit directorul de lucru, utilizatorul serviciului și mediul. Exemplul presupune că utilizatorul koala-agent, mediul virtual, modulul worker și fișierul privat de mediu există deja; adaptează-le înainte de a instala o unitate.
- Folosiți un cont de serviciu dedicat
- Setați o întârziere de repornire și un plafon de eșecuri
- Verificați starea anterioară a jobului înainte de a porni o rulare programată
[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.targetDocumentație oficială: Semantica serviciului systemd
Setați un buget zilnic și o limită de duplicare
Stabilește pentru worker un număr maxim de cereri, o limită de cheltuieli și un timeout de execuție. Folosește o înregistrare durabilă de idempotență pentru acțiunile care afectează lumea exterioară. Un clic reușit în browser poate avea loc înainte ca procesul să primească un răspuns; inspectează starea externă înainte de a încerca din nou. Montările de secrete din Docker Compose pot ține un secret în afara imaginii, dar permisiunile și aplicația consumatoare necesită încă o revizuire.
Documentație oficială: Secrete Docker Compose
Acordați unui job periodic o politică explicită de recuperare
Utilizați un serviciu de lungă durată pentru un lucrător de coadă persistent și un serviciu oneshot declanșat de temporizator pentru o sarcină programată delimitată. Cu un temporizator calendaristic systemd, Persistent=true poate declanșa o singură activare ratată după o perioadă de nefuncționare; nu recreează un întreg restanțier de activitate. Decideți dacă această recuperare este dorită. RandomizedDelaySec poate distribui pornirile, în timp ce un lease la nivel de aplicație împiedică două replici să proceseze aceeași activitate programată.
- Înregistrați fusul orar dorit și inspectați următoarele ore de rulare înainte de a activa programarea.
- Mențineți termenul de execuție al sarcinii mai scurt decât un interval care nu trebuie să se suprapună sau utilizați o închiriere durabilă cu expirare și proprietate.
- Faceți ca sarcina să selecteze lucrările restante din starea stocată, în loc să presupună că fiecare eveniment de timer anterior a rulat.
- Verificați versiunea systemd instalată înainte de a folosi o directivă din cel mai recent manual.
# 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-pagerDocumentație oficială: systemd: programare cu timer
Diferențiază o buclă de crash de un worker blocat
O politică de repornire poate recupera un proces eșuat, dar repetarea unei acreditări invalide sau a unei migrări defectuoase la fiecare câteva secunde face o defecțiune mai zgomotoasă. Limitați pornirile serviciului și alertați la eșecuri repetate. Un proces activ poate fi și blocat: măsurați vechimea celei mai vechi sarcini și a ultimei operațiuni finalizate. Testați o cădere API, un disc plin și o oprire a procesului cu sarcini de unică folosință, apoi verificați că starea durabilă previne acțiunile externe duplicate.
- Setați în aplicație un buget pentru furnizor și un timeout pentru cereri, precum și o limită CPU/memorie la nivelul runtime-ului.
- Containerele Docker nu au o limită de memorie utilă specifică sarcinii doar pentru că sunt containere; configurați și testați limitele în mod deliberat.
- Stocați un secret în afara imaginii și a arborelui public, apoi testați că jurnalele de erori și diagnosticele îl ascund.
- Păstrați o rută de oprire manuală și solicitați o revizuire adecvată pentru cheltuieli, scrieri în producție sau mesaje externe.
Documentație oficială: systemd: supravegherea serviciilor · Docker: constrângeri de resurse ale containerelor