Hvernig á að keyra bakgrunnsverk í vefforriti: biðraðir, áætlanir og cron
Til að keyra bakgrunnsverk í vefforriti skaltu fyrst skipta vinnunni í tvo flokka. Kveikt verk (senda velkomin tölvupóst, vinna úr upphleðslu) er hægt að vista í verkbiðröð, oft töflu í gagnagrunninum þínum, og láta starfsmann keyra það með endurtilraunum. Tímasett verk (næturskýrsla, áminningar á 15 mínútna fresti) þurfa eitthvað sem ræsir á tímaáætlun: cron-eiginleika hýsingarinnar, eða utanaðkomandi tímaáætlun sem kallar á varinn endapunkt í appinu þínu. Gerðu alltaf verk örugg í að keyra tvisvar, skráðu bilanir, og treystu aldrei á tímamæli inni í þjóni sem getur sofið eða endurræst sig.
Þessi leiðarvísir útskýrir valkostina, hvenær hver þeirra hentar, og hvernig á að setja þá upp með AI-smiði, þar á meðal á hýsingum sem skala niður í núll.
Hvað telst bakgrunnsverk
Allt sem er hægt, óáreiðanlegt eða ekki þarf fyrir tafarlaus viðbrögð notandans:
- Senda tölvupósta, tilkynningar og kvittanir
- Breyta stærð mynda, umkóða myndbönd, búa til PDF-skjöl
- Kalla á hæg þjónustur þriðja aðila, þar á meðal AI-módel í löng verk
- Flytja inn eða samstilla gögn frá öðru kerfi
- Næturhreinsun, skýrslur og áminningar
Að gera þetta innan beiðninnar gerir síður hægar og brothættar: ef tölvupóstveitan liggur niðri mistekst nýskráning notandans. Með því að færa þetta í bakgrunn fær notandinn tafarlaust svar og verkið má endurreyna.
Valkostirnir
| Valkostur | Hvernig hann virkar | Kostir | Gallar |
|---|---|---|---|
| Skjóta-og-gleyma í sama ferli | Svara, og halda síðan áfram verkinu í þjóninum | Engin uppsetning | Tapast ef þjónninn stoppar; engar endurtilraunir |
Tímamælir í ferli (setInterval, setTimeout) | Tímamælir í keyrandi þjóninum | Einfalt | Keyrir ekki meðan appið sefur; tvöföldun með mörgum eintökum |
| Gagnagrunnsbiðröð | Verk vistuð sem línur; starfsmaður tekur fyrir þau og keyrir | Notar gagnagrunninn sem þú hefur; varanlegt; auðvelt að skoða | Þú smíðar endurtilraunir og læsingar; þarf eitthvað sem keyrir starfsmanninn |
| Sérstök biðröð (Redis-byggð eða hýst) | Biðraðarþjónusta og starfsmenn | Þroskaðir eiginleikar fyrir endurtilraunir og tímasetningu | Önnur þjónusta sem þarf að keyra og borga fyrir |
| Hýst verk- eða vinnuflæðisþjónusta | Þjónusta þriðja aðila kallar á endapunktana þína með endurtilraunum | Tímasetning og endurtilraunir sjá um sig | Háð söluaðila; annar reikningur og lykill |
| Utanaðkomandi tímaáætlun sem kallar á endapunkt | Tímamælir annars staðar sendir HTTP-beiðni á áætlun | Virkar á hvaða hýsingu sem er, þar á meðal skölun niður í núll | Lágmarksbil og tafir; verndaðu endapunktinn |
| Innbyggt cron hýsingarinnar | Vettvangurinn keyrir skipun á áætlun | Einfalt þar sem það er til staðar | Ekki allar hýsingar bjóða það |
Engin ein rétt lausn er til. Lítið app þarf oft aðeins gagnagrunnsbiðröð og utanaðkomandi tímaáætlun.
Af hverju hýsingar sem skala niður í núll breyta myndinni
Margar nútíma hýsingar setja appið þitt í svefn þegar enginn notar það og vekja það við næstu beiðni. Það sparar peninga, en sofandi þjónn keyrir engan kóða: tímamælar ræsast ekki og starfsmenn kanna ekki biðröðina. Á þessum hýsingum þarf tímasett vinna að byrja á innkominni beiðni, og auðveldasta uppspretta þeirrar beiðni er utanaðkomandi tímaáætlun. Hvert kall vekur appið (og oft gagnagrunninn), svo kall á hverri mínútu kostar meira en á 15 mínútna fresti. Veldu hægasta áætlunina sem uppfyllir þörfina.
Mynstur 1: gagnagrunnsbiðröð
Fyrir kveikt verk:
- Búðu til töfluna
jobs: tegund, gögn (JSON), staða (pending,running,done,failed), fjöldi tilrauna, run_after, last_error, tímastimplar. - Þegar eitthvað gerist setur þú verkalínu inn í sömu færslu og breytingin sem kallaði á það, svo þau heppnast eða mistakast saman.
- Starfsmaður tekur verk sem eru tímabær, merkir þau
running, framkvæmir þau og merkir þaudone. - Ef verk mistekst hækkarðu
attempts, seturrun_aftersíðar (til dæmis 1, 5, og síðan 30 mínútur) og geymir villuna. Eftir hámark merkirðu þaðfailedog lætur einhvern vita.
Ef fleiri en einn starfsmaður gæti keyrt í einu þarf að taka verkin með öruggum hætti. Í Postgres leyfir SELECT ... FOR UPDATE SKIP LOCKED hverjum starfsmanni að taka mismunandi línur án árekstra.
Hvað keyrir starfsmanninn? Á þjóni sem er alltaf í gangi, lykkja í sérstöku ferli. Á hýsingu sem skalar niður í núll getur tímasetti endapunkturinn í mynstri 2 unnið hóp af tímabærum verkum í hverju kalli.
Mynstur 2: utanaðkomandi tímaáætlun sem kallar á appið þitt
Fyrir tímasett verk:
- Bættu við endapunkti eins og
POST /api/cron/send-reminders. - Verndaðu hann: krefstu leynilegs lykils í haus, geymdu hann sem leyndarmál á báðum hliðum, og hafnaðu öllu öðru.
- Gerðu hann idempotent: keyrsla tvisvar á sömu mínútu má ekki senda tvær áminningar. Skráðu hvað var sent.
- Haltu hverju kalli stuttu: vinndu hóp (til dæmis 100 atriði) og láttu næsta kall taka afganginn.
- Beindu tímaáætlun á hann.
Val á tímaáætlun:
- GitHub Actions tímasettir vinnuflæði. Ókeypis innan notkunarmarka GitHub. Frá og með september 2026 segja skjöl GitHub að stysta bil sé einu sinni á 5 mínútna fresti, keyrslur geta tafist á annatíma (sérstaklega í upphafi hverrar klukkustundar), tímasetningar nota UTC sjálfgefið, og tímasett vinnuflæði í opinberri geymslu eru gerð óvirk eftir 60 daga án virkni í geymslunni.
- Hýstar cron-þjónustur. Til eru margar þjónustur sem gera ekkert annað en að kalla á slóð eftir áætlun. Athugaðu áreiðanleika, lágmarksbil og viðvaranir áður en þú treystir á eina.
- Tímaáætlun skýjaveitunnar. Ef þú notar stóra skýjaveitu er þar tímaáætlun sem getur kallað á HTTPS-endapunkt.
- Hýst verk- eða vinnuflæðisþjónusta. Þær sameina tímasetningu, biðraðir og endurtilraunir og kalla á endapunktana þína fyrir hvert skref. Berðu saman verð og takmörk á vefsíðu hvers söluaðila.
Mynstur 3: láttu þjónustuveituna sjá um það
Stundum er besta bakgrunnsverkið ekkert verk:
- Greiðslur. Stripe reynir aftur misheppnaðar áskriftargreiðslur og sendir webhook-skilaboð; þú bregst við í stað þess að spyrja. Sjá hvað webhook er.
- Tölvupóstur. Veitendur setja skilaboð í biðröð og endurreyna sendingu þegar þú hefur skilað þeim.
- Hópvinna með AI. OpenAI og Anthropic bjóða hópa-API fyrir beiðnir sem ekki eru brýnar, sem þú sendir inn og sækir síðar.
Fyrirmæli til AI-smiðsins
Fyrir biðröð:
Bættu við bakgrunnsbiðröð með töflunni
jobsí gagnagrunninum okkar (tegund, gögn sem JSON, staða, attempts, run_after, last_error). Þegar notandi nýskráir sig skaltu setja verkið send_welcome_email inn í sömu færslu í stað þess að senda inline. Bættu við fallinu processJobs(limit) sem tekur tímabær verk með SELECT ... FOR UPDATE SKIP LOCKED, keyrir þau og reynir aftur eftir 1, 5 og 30 mínútur, og merkir þau failed eftir 4 tilraunir.
Fyrir tímasetta kveikju:
Bættu við POST /api/cron/tick sem er varinn með bearer-lykli úr leyndarmálinu CRON_SECRET; hafnaðu öllum beiðnum án hans. Hvert kall keyrir processJobs(100) og sendir bókunaráminningar sem eiga að fara út innan 24 klukkustunda og hafa ekki verið sendar, og skráir sendar áminningar svo ekkert sé sent tvisvar. Skilaðu JSON-samantekt á því sem keyrði. Skrifaðu síðan GitHub Actions-vinnuflæði sem kallar á þennan endapunkt á 15 mínútna fresti, og les slóðina og lykilinn úr leyndarmálum geymslunnar.
Algeng mistök
- Treysta á
setInterval. Það hættir þegjandi þegar þjónninn sefur eða endurræsist, og tvöfaldast þegar tvö eintök keyra. - Óvarinn cron-endapunktur. Hver sem finnur hann getur kallað á verkin þín, eða reikning þinn fyrir tölvupóst.
- Verk sem eru ekki idempotent. Endurtilraunir og tvöföld köll tímaáætlunar munu gerast. Hannaðu fyrir það.
- Engin sýnileiki á bilunum. Verk sem mistekst þegjandi í viku er verra en það sem mistekst hátt. Skráðu villur og láttu vita af endurteknum bilunum.
- Löng keyrsla í einni beiðni. Beiðnir renna út á tíma. Vinndu í hópum.
- Of oft tímasett. Hvert kall á hýsingu sem skalar niður í núll vekur og rukkar appið. Passaðu bilið við raunverulega þörf.
- Tímabelti. „Klukkan 9“ þýðir ólíka hluti fyrir tímaáætlunina (oft UTC) og notendur þína. Geymdu tíma í UTC og breyttu fyrir hvern notanda.
- Leyndarmál í vinnuflæðisskránni. Geymdu lykla í leyndarmálageymslu tímaáætlunarinnar. Sjá hvernig á að halda API-lyklum öruggum.
Gátlisti
- Hægt verk flutt úr beiðnum notenda
- Verk geymd varanlega, ekki aðeins í minni
- Endurtilraunir með vaxandi bilum og hámarki
- Sérhvert verk öruggt í að keyra tvisvar
- Tímasetti endapunkturinn varinn með leynilegum lykli
- Hver keyrsla vinnur afmarkaðan hóp
- Mistókst verk sýnileg, með viðvörunum
- Bil tímaáætlunar valið með hýsingarkostnað í huga
- Tímar geymdir í UTC
Bakgrunnsverk í Mythex
Skjölun Mythex lýsir ekki tímasettum verkum eða cron-verkum, og útgefin öpp og gagnagrunnar þeirra sofa þegar þau eru óvirk og vakna við næstu beiðni (sjá Hýsingartakmörk). Treystu því ekki á tímamæla inni í appinu. Aðferðin sem virkar er sú sem lýst er hér að ofan: biddu agentinn um verkatöflu og endapunkt varðan með lykli, og beindu síðan utanaðkomandi tímaáætlun á útgefna slóðina þína. Geymdu lykilinn sem verkefnisleyndarmál, og mundu að hvert vakning eyðir inneign fyrir þann tíma sem appið og gagnagrunnurinn eru vakandi, svo veldu skynsamlegt bil. Ef appið þitt þarf API-bakenda fyrir þetta er REST API bakendauppskriftin góður upphafspunktur, og hvernig á að smíða REST API fjallar um hönnun endapunktanna. Ef keyrandi starfsmenn eða vélmenni eru kjarni vörunnar þinnar gæti hýsing sem er byggð fyrir varanleg ferli hentað betur.
Spurningar
Hvað er bakgrunnsverk?
Bakgrunnsverk er vinna sem appið þitt framkvæmir utan beiðninnar sem notandi bíður eftir, til dæmis að senda tölvupósta, breyta stærð mynda, búa til skýrslur eða samstilla gögn. Notandinn fær hraða svörun, verkið keyrir sér og hægt er að endurreyna það ef það mistekst.
Hvernig keyri ég tímasett verk ef hýsingin mín hefur ekki cron?
Bættu við vörðu endapunkti sem framkvæmir verkið, og láttu síðan utanaðkomandi tímaáætlun kalla á hann eftir dagskrá. Valkostir eru tímasett GitHub Actions-keyrsla, hýst cron-þjónusta eða tímaáætlun skýjaveitunnar þinnar. Verndaðu endapunktinn með leynilegu lykilorði.
Get ég notað setInterval eða setTimeout fyrir tímasett verk?
Aðeins fyrir lítil, ómikilvæg verk á þjóni sem er alltaf í gangi. Ef þjónninn endurræsist, skalast niður í núll eða keyrir í nokkrum eintökum tapast tímamælar eða keyra oftar en einu sinni. Geymdu tímasett verk í gagnagrunni eða notaðu tímaáætlun.
Styður Mythex cron-verk?
Skjölun Mythex lýsir ekki tímasettum verkum eða cron-verkum, og útgefin öpp sofa þegar þau eru óvirk. Áreiðanlega leiðin er utanaðkomandi tímaáætlun sem kallar á varinn endapunkt í appinu þínu, sem vekur appið og keyrir verkið.