Kako pokretati pozadinske poslove u web aplikaciji: redovi, planeri i cron
Da biste pokrenuli pozadinske poslove u web aplikaciji, prvo podelite posao na dve vrste. Okidani poslovi (slanje dobrodošlog imejla, obrada otpremljenog fajla) mogu se sačuvati u red poslova, često kao tabela u vašoj bazi, a obrađuje ih radnik sa ponovnim pokušajima. Zakazani poslovi (noćni izveštaj, podsetnici na svakih 15 minuta) treba nešto što se pokreće po rasporedu: funkcija cron-a na hostu ili spoljni planer koji poziva zaštićenu krajnju tačku u vašoj aplikaciji. Uvek neka poslovi budu bezbedni za dvostruko pokretanje, beležite greške i nikada ne oslanjajte se na tajmer unutar servera koji može da spava ili se ponovo pokrene.
Ovaj vodič objašnjava opcije, kada koja odgovara i kako ih podesiti uz AI graditelja aplikacija, uključujući hostove koji se skaliraju na nulu.
Šta se računa kao pozadinski posao
Svaki posao koji je spor, nepouzdan ili nije potreban za trenutni odgovor korisniku:
- Slanje imejlova, obaveštenja i računa
- Promena veličine slika, transkodiranje videa, pravljenje PDF-ova
- Pozivi sporih API-ja trećih strana, uključujući AI modele za duge zadatke
- Uvoz ili sinhronizacija podataka iz drugog sistema
- Noćno čišćenje, izveštaji i podsetnici
Kada se ovo radi unutar zahteva, stranice postaju spore i krhke: ako je provajder imejla pao, registracija korisnika ne uspeva. Prebacivanje u pozadinu znači da korisnik dobija trenutni odgovor, a posao se može ponovo pokrenuti.
Opcije
| Opcija | Kako radi | Prednosti | Mane |
|---|---|---|---|
| Pokreni i zaboravi u istom procesu | Odgovori, pa nastavi rad na serveru | Nema podešavanja | Gubi se ako se server zaustavi; nema ponovnih pokušaja |
Tajmer u procesu (setInterval, setTimeout) | Tajmer u pokrenutom serveru | Trivijalno | Ne radi dok spava; duplira se sa više kopija |
| Red poslova u bazi | Poslovi se čuvaju kao redovi; radnik ih preuzme i izvrši | Koristi bazu koju već imate; trajno; lako za pregled | Sami pravite ponovne pokušaje i zaključavanje; treba nešto što pokreće radnika |
| Namenski red (zasnovan na Redis-u ili upravljan) | Servis reda plus radnici | Zreli ponovni pokušaji i zakazivanje | Još jedan servis za pokretanje i plaćanje |
| Hostovani servis za poslove ili tokove | Treća strana poziva vaše krajnje tačke sa ponovnim pokušajima i rasporedima | Zakazivanje i ponovni pokušaji se rade za vas | Zavisnost od dobavljača; još jedan nalog i ključ |
| Spoljni planer koji poziva krajnju tačku | Tajmer negde drugde šalje HTTP zahtev po rasporedu | Radi na bilo kom hostu, uključujući one koji se skaliraju na nulu | Minimalni intervali i kašnjenja; zaštitite krajnju tačku |
| Ugrađeni cron hosta | Platforma pokreće komandu po rasporedu | Jednostavno tamo gde postoji | Ne nudi svaki host |
Ne postoji jedan pravi odgovor. Mala aplikacija često treba samo red u bazi i spoljni planer.
Zašto hostovi koji se skaliraju na nulu menjaju sliku
Mnogi savremeni hostovi uspavaju vašu aplikaciju kada je niko ne koristi i bude je pri sledećem zahtevu. To štedi novac, ali uspavani server ne izvršava kod: tajmeri se ne aktiviraju i radnici ne proveravaju red. Na tim hostovima zakazani rad mora da počne dolaznim zahtevom, a najlakši izvor tog zahteva je spoljni planer. Svaki poziv budi aplikaciju (i često njenu bazu), pa pozivanje svakog minuta košta više nego na svakih 15 minuta. Izaberite najređi raspored koji zadovoljava potrebu.
Obrazac 1: red poslova u bazi
Za okidane poslove:
- Napravite tabelu
jobs: tip, payload (JSON), status (pending,running,done,failed), attempts, run_after, last_error, vremenske oznake. - Kada se nešto desi, ubacite red posla u istoj transakciji kao promena koja ga je izazvala, pa uspeju ili propadnu zajedno.
- Radnik preuzima poslove koji su na redu, označava ih kao
running, izvršava ih i označava kaodone. - Pri neuspehu, povećajte
attempts, postaviterun_afterkasnije (na primer 1, 5, pa 30 minuta) i sačuvajte grešku. Posle maksimuma, označite kaofailedi obavestite nekoga.
Ako više radnika može da radi istovremeno, poslovi moraju bezbedno da se preuzmu. Na Postgres-u, SELECT ... FOR UPDATE SKIP LOCKED omogućava da svaki radnik preuzme različite redove bez sukoba.
Šta pokreće radnika? Na serveru koji je uvek uključen, petlja u posebnom procesu. Na hostu koji se skalira na nulu, zakazana krajnja tačka iz obrasca 2 može obraditi seriju poslova na svakom pozivu.
Obrazac 2: spoljni planer koji poziva vašu aplikaciju
Za zakazane poslove:
- Dodajte krajnju tačku kao što je
POST /api/cron/send-reminders. - Zaštitite je: zahtevajte tajni token u zaglavlju, sačuvan kao tajna na obe strane, i odbijte sve ostalo.
- Neka bude idempotentna: pokretanje dva puta u istom minutu ne sme poslati dva podsetnika. Zabeležite šta je poslato.
- Neka svaki poziv bude kratak: obradite seriju (recimo 100 stavki), a sledeći poziv neka preuzme ostatak.
- Usmerite planer na nju.
Izbor planera:
- Zakazani GitHub Actions workflow-i. Besplatni u okviru GitHub-ovih ograničenja korišćenja. Od septembra 2026, GitHub dokumentacija kaže da je najkraći interval jednom na 5 minuta, pokretanja mogu kasniti u vreme velikog opterećenja (posebno na početku svakog sata), rasporedi koriste UTC podrazumevano, a zakazani workflow-i u javnom repozitorijumu se isključuju posle 60 dana bez aktivnosti u repozitorijumu.
- Hostovane cron usluge. Postoje mnoge usluge čiji je jedini posao da pozivaju URL po rasporedu. Proverite pouzdanost, minimalni interval i upozorenja pre nego što se oslonite na nju.
- Planer vašeg cloud provajdera. Ako već koristite veliki cloud provajder, imaće upravljani planer koji može da poziva HTTPS krajnju tačku.
- Hostovani servis za poslove ili tokove. Oni kombinuju zakazivanje, redove i ponovne pokušaje i pozivaju vaše krajnje tačke za svaki korak. Uporedite cene i ograničenja na sajtu svakog dobavljača.
Obrazac 3: neka to uradi provajder
Nekad je najbolji pozadinski posao — nijedan:
- Plaćanja. Stripe ponavlja neuspele uplate pretplate i šalje webhook-ove; vi reagujete umesto da proveravate. Pogledajte šta je webhook.
- Imejl. Provajderi stavljaju isporuku u red i ponavljaju je kada im predate poruku.
- Grupni AI rad. OpenAI i Anthropic nude batch API-je za nehitne zahteve koje šaljete i preuzimate kasnije.
Upiti za vašeg AI graditelja
Za red:
Dodaj red za pozadinske poslove koristeći tabelu jobs u našoj bazi (tip, payload JSON, status, attempts, run_after, last_error). Kada se korisnik registruje, ubaci posao send_welcome_email u istoj transakciji umesto da šalješ inline. Dodaj funkciju processJobs(limit) koja preuzima poslove na redu pomoću SELECT ... FOR UPDATE SKIP LOCKED, izvršava ih i ponavlja neuspehe posle 1, 5 i 30 minuta, a označava ih kao failed posle 4 pokušaja.
Za zakazani okidač:
Dodaj POST /api/cron/tick zaštićen bearer tokenom iz tajne CRON_SECRET; odbij svaki zahtev bez njega. Svaki poziv pokreće processJobs(100) i šalje podsetnike za rezervacije koji su na redu u narednih 24 sata, a još nisu poslati, uz beleženje poslatih podsetnika da se ništa ne pošalje dvaput. Vrati JSON rezime onoga što je pokrenuto. Zatim napiši GitHub Actions workflow koji poziva ovu krajnju tačku na svakih 15 minuta, čitajući URL i token iz tajni repozitorijuma.
Uobičajene greške
- Oslanjanje na
setInterval. Tiho prestaje kada se server uspava ili ponovo pokrene, a duplira se kada rade dve kopije. - Nezaštićena cron krajnja tačka. Svako ko je pronađe može da pokrene vaše poslove ili vaš račun za imejl.
- Poslovi koji nisu idempotentni. Ponovni pokušaji i dupli pozivi planera će se dešavati. Projektujte za to.
- Nema vidljivosti grešaka. Posao koji tiho ne uspeva nedelju dana gori od onog koji glasno pada. Beležite greške i upozoravajte pri ponovljenim neuspesima.
- Dugi rad u jednom zahtevu. Zahtevi ističu. Obrađujte u serijama.
- Previše često zakazivanje. Svaki poziv na hostu koji se skalira na nulu budi i naplaćuje aplikaciju. Uskladite interval sa stvarnom potrebom.
- Vremenske zone. „9 ujutru“ znači različite stvari za vaš planer (često UTC) i za vaše korisnike. Čuvajte vremena u UTC i pretvarajte ih za svakog korisnika.
- Tajne u fajlu workflow-a. Držite tokene u tajnom skladištu planera. Pogledajte kako čuvati API ključeve bezbednim.
Kontrolna lista
- Spori rad je premešten van korisničkih zahteva
- Poslovi su trajno sačuvani, ne samo u memoriji
- Ponovni pokušaji sa rastućim pauzama i maksimumom
- Svaki posao je bezbedan za dvostruko pokretanje
- Zakazana krajnja tačka je zaštićena tajnim tokenom
- Svako pokretanje obrađuje ograničenu seriju
- Neuspeli poslovi su vidljivi, uz upozorenja
- Interval rasporeda izabran uzimajući u obzir trošak hostinga
- Vremena su sačuvana u UTC
Pozadinski poslovi u Mythex-u
Mythex dokumentacija ne opisuje zakazane ni cron poslove, a objavljene aplikacije i njihove baze spavaju kada su neaktivne i bude se pri sledećem zahtevu (pogledajte Ograničenja hostinga). Zato se ne oslanjajte na tajmere unutar aplikacije. Pristup koji radi je onaj iznad: zamolite agenta za tabelu poslova i krajnju tačku zaštićenu tokenom, pa usmerite spoljni planer na vaš objavljeni URL. Token čuvajte kao tajnu projekta i imajte na umu da svako buđenje troši kredite za vreme dok su aplikacija i baza budne, pa izaberite razuman interval. Ako vašoj aplikaciji za ovo treba API pozadina, recept za REST API pozadinu je polazna tačka, a kako napraviti REST API objašnjava dizajn krajnjih tačaka. Ako su pozadinski radnici ili botovi suština vašeg proizvoda, host napravljen za trajne procese može bolje da odgovara.
Pitanja
Šta je pozadinski posao?
Pozadinski posao je posao koji vaša aplikacija radi van zahteva na koji korisnik čeka, na primer slanje imejlova, promena veličine slika, pravljenje izveštaja ili sinhronizacija podataka. Korisnik dobija brz odgovor, a posao se izvršava odvojeno i može se ponoviti ako ne uspe.
Kako da pokrenem zakazani zadatak ako moj host nema cron?
Dodajte zaštićenu krajnju tačku koja obavlja posao, pa neka je spoljni planer poziva po rasporedu. Opcije uključuju zakazani GitHub Actions workflow, uslugu cron-a u oblaku ili planer vašeg cloud provajdera. Zaštitite krajnju tačku tajnim tokenom.
Mogu li da koristim setInterval ili setTimeout za zakazane poslove?
Samo za male, nebitne zadatke na serveru koji je uvek pokrenut. Ako se server ponovo pokrene, skalira na nulu ili radi u više kopija, tajmeri se gube ili se izvršavaju više puta. Zakazani posao čuvajte u bazi ili koristite planer.
Da li Mythex podržava cron poslove?
Mythex dokumentacija ne opisuje zakazane ni cron poslove, a objavljene aplikacije spavaju kada su neaktivne. Pouzdan pristup je spoljni planer koji poziva zaštićenu krajnju tačku u vašoj aplikaciji, što budi aplikaciju i pokreće posao.