Näin ajat taustatöitä verkkosovelluksessa: jonot, ajastimet ja cron
Taustatöiden ajamiseksi verkkosovelluksessa jaa työ ensin kahteen tyyppiin. Laukaistut työt (lähetä tervetuloviesti, käsittele lataus) voidaan tallentaa työjonoon, usein tietokantasi taulukkoon, ja käsitellä työntekijällä, jolla on uudelleenyritykset. Ajastetut työt (yöraportti, muistutukset 15 minuutin välein) tarvitsevat jotain, joka käynnistyy aikataulun mukaan: alustan cron-ominaisuuden tai ulkoisen ajastimen, joka kutsuu sovelluksesi suojattua päätepistettä. Tee töistä aina turvallisia ajaa kahdesti, kirjaa virheet, äläkä koskaan luota ajastimeen palvelimen sisällä, joka voi nukkua tai käynnistyä uudelleen.
Tämä opas selittää vaihtoehdot, milloin kukin sopii ja miten ne pystytetään tekoälypohjaisella sovellusrakentajalla, myös alustoilla, jotka skaalautuvat nollaan.
Mikä lasketaan taustatyöksi
Kaikki, mikä on hidasta, epävarmaa tai ei ole tarpeen käyttäjän välittömään vastaukseen:
- Sähköpostien, ilmoitusten ja kuittien lähettäminen
- Kuvien muuttaminen kokoon, videon koodaus, PDF-tiedostojen luominen
- Hitaiden kolmannen osapuolen API-rajapintojen kutsuminen, mukaan lukien tekoälymallit pitkissä tehtävissä
- Tietojen tuominen tai synkronointi toisesta järjestelmästä
- Yöllinen siivous, raportit ja muistutukset
Tämän tekeminen pyynnön sisällä tekee sivuista hitaita ja hauraita: jos sähköpostipalvelu on alhaalla, käyttäjän rekisteröityminen epäonnistuu. Taustalle siirtäminen tarkoittaa, että käyttäjä saa välittömän vastauksen ja työtä voi yrittää uudelleen.
Vaihtoehdot
| Vaihtoehto | Miten se toimii | Hyvää | Huonoa |
|---|---|---|---|
| Käynnistä ja unohda samassa prosessissa | Vastaa, jatka työtä palvelimessa | Ei asennusta | Katoaa, jos palvelin pysähtyy; ei uudelleenyrityksiä |
Prosessin sisäinen ajastin (setInterval, setTimeout) | Ajastin käynnissä olevassa palvelimessa | Triviaali | Ei aja nukkuessa; kaksoiskappaleet useilla kopioilla |
| Tietokantapohjainen jono | Työt tallennetaan riveinä; työntekijä ottaa ja ajaa ne | Käyttää olemassa olevaa tietokantaa; kestävä; helppo tarkastaa | Rakennat itse uudelleenyritykset ja lukitukset; tarvitsee jotain, joka ajaa työntekijän |
| Erillinen jono (Redis-pohjainen tai hallittu) | Jonopalvelu ja työntekijät | Kypsät uudelleenyritys- ja ajastusominaisuudet | Toinen palvelu ajettavaksi ja maksettavaksi |
| Hallittu työ- tai työnkulkupalvelu | Kolmas osapuoli kutsuu päätepisteitäsi uudelleenyrityksillä ja aikatauluilla | Ajastus ja uudelleenyritykset hoituvat puolestasi | Toimittajariippuvuus; toinen tili ja avain |
| Ulkoinen ajastin, joka kutsuu päätepistettä | Ajastin muualla lähettää HTTP-pyynnön aikataulun mukaan | Toimii millä tahansa alustalla, myös skaalautuvilla nollaan | Vähimmäisvälit ja viiveet; suojaa päätepiste |
| Alustan oma cron | Alusta ajaa komennon aikataulun mukaan | Yksinkertainen siellä, missä se on | Kaikki alustat eivät tarjoa sitä |
Yhtä oikeaa vastausta ei ole. Pieni sovellus tarvitsee usein vain tietokantajonon ja ulkoisen ajastimen.
Miksi nollaan skaalautuvat alustat muuttavat kuvaa
Monet nykyaikaiset alustat laittavat sovelluksesi nukkumaan, kun kukaan ei käytä sitä, ja herättävät sen seuraavalla pyynnöllä. Se säästää rahaa, mutta nukkuva palvelin ei aja koodia: ajastimet eivät laukea ja työntekijät eivät kysele. Näillä alustoilla ajastettujen töiden pitää alkaa saapuvasta pyynnöstä, ja helpoin tämän pyynnön lähde on ulkoinen ajastin. Jokainen kutsu herättää sovelluksen (ja usein sen tietokannan), joten kutsuminen joka minuutti maksaa enemmän kuin joka 15 minuutti. Valitse hitain aikataulu, joka täyttää tarpeen.
Malli 1: tietokantatyöjono
Laukaistuihin töihin:
- Luo
jobs-taulu: tyyppi, payload (JSON), tila (pending,running,done,failed), yritykset, run_after, last_error, aikaleimat. - Kun jotain tapahtuu, lisää työrivi samassa transaktiossa kuin muutos, joka sen aiheutti, jotta ne onnistuvat tai epäonnistuvat yhdessä.
- Työntekijä poimii erääntyneet työt, merkitsee ne
running-tilaan, tekee työn ja merkitsee nedone-tilaan. - Epäonnistuessa kasvata
attempts-arvoa, asetarun_aftermyöhemmäksi (esimerkiksi 1, 5 ja sitten 30 minuuttia) ja tallenna virhe. Enimmäismäärän jälkeen merkitse työfailed-tilaan ja hälytä jollekulle.
Jos useampi työntekijä voi ajaa samaan aikaan, työt on otettava turvallisesti. Postgresissa SELECT ... FOR UPDATE SKIP LOCKED antaa jokaisen työntekijän ottaa eri rivit ilman törmäyksiä.
Mikä ajaa työntekijän? Aina päällä olevalla palvelimella silmukka erillisessä prosessissa. Nollaan skaalautuvalla alustalla Mallin 2 ajastettu päätepiste voi käsitellä erän erääntyneitä töitä joka kutsulla.
Malli 2: ulkoinen ajastin, joka kutsuu sovellustasi
Ajastettuihin töihin:
- Lisää päätepiste, kuten
POST /api/cron/send-reminders. - Suojaa se: vaadi salainen tunnus otsikossa, tallennettuna salaisuutena molemmilla puolilla, ja hylkää kaikki muu.
- Tee siitä idempotentti: kahden ajon samassa minuutissa ei saa lähettää kahta muistutusta. Kirjaa, mitä lähetettiin.
- Pidä jokainen kutsu lyhyenä: käsittele erä (esimerkiksi 100 kohdetta) ja anna seuraavan kutsun ottaa loput.
- Osoita ajastin siihen.
Ajastinvaihtoehdot:
- GitHub Actions -ajastetut työnkulut. Ilmaisia GitHubin käyttörajojen puitteissa. Syyskuusta 2026 lähtien GitHubin dokumentaation mukaan lyhin väli on kerran 5 minuutissa, ajoja voidaan viivästyttää ruuhka-aikoina (erityisesti jokaisen tunnin alussa), aikataulut käyttävät oletuksena UTC-aikaa, ja julkisessa repositoriossa ajastetut työnkulut poistetaan käytöstä 60 päivän repositoriotoimintattomuuden jälkeen.
- Hallitut cron-palvelut. Monet palvelut ovat olemassa vain kutsuakseen URL-osoitetta aikataulun mukaan. Tarkista luotettavuus, vähimmäisväli ja hälytykset ennen kuin luotat yhteen.
- Pilvipalveluntarjoajasi ajastin. Jos käytät jo suurta pilvipalveluntarjoajaa, sillä on hallittu ajastin, joka voi kutsua HTTPS-päätepistettä.
- Hallittu työ- tai työnkulkupalvelu. Nämä yhdistävät ajastuksen, jonot ja uudelleenyritykset ja kutsuvat päätepisteitäsi jokaisessa vaiheessa. Vertaa hinnoittelua ja rajoja kunkin toimittajan sivuilta.
Malli 3: anna palveluntarjoajan hoitaa se
Joskus paras taustatyö on ei lainkaan taustatyötä:
- Maksut. Stripe yrittää epäonnistuneet tilausmaksut uudelleen ja lähettää webhookit; sinä reagoit sen sijaan, että kyselisit. Katso mitä webhook on.
- Sähköposti. Palveluntarjoajat jonottavat ja yrittävät toimitusta uudelleen, kun olet luovuttanut viestin.
- Massa-tekoälytyö. OpenAI ja Anthropic tarjoavat erä-API:t kiireettömille pyynnöille, jotka lähetät ja noudat myöhemmin.
Kehotteet tekoälyrakentajallesi
Jonolle:
Lisää taustatyöjono käyttäen jobs-taulua tietokannassamme (tyyppi, payload JSON, tila, attempts, run_after, last_error). Kun käyttäjä rekisteröityy, lisää send_welcome_email-työ samaan transaktioon sen sijaan, että lähettäisit sen suoraan. Lisää processJobs(limit)-funktio, joka ottaa erääntyneet työt SELECT ... FOR UPDATE SKIP LOCKED -kyselyllä, ajaa ne ja yrittää epäonnistuneita uudelleen 1, 5 ja 30 minuutin kuluttua, merkiten ne failed-tilaan 4 yrityksen jälkeen.
Ajastetulle laukaisijalle:
Lisää POST /api/cron/tick, jota suojaa bearer-tunnus salaisuudesta CRON_SECRET; hylkää jokainen pyyntö ilman sitä. Jokainen kutsu ajaa processJobs(100)-funktion ja lähettää muistutukset varauksista, jotka erääntyvät seuraavien 24 tunnin aikana ja joita ei ole vielä lähetetty, kirjaten lähetetyt muistutukset, jotta mitään ei lähetetä kahdesti. Palauta JSON-yhteenveto ajetusta. Kirjoita sitten GitHub Actions -työnkulku, joka kutsuu tätä päätepistettä 15 minuutin välein, lukien URL-osoitteen ja tunnuksen repositorion salaisuuksista.
Yleisimmät virheet
- Luottaminen
setInterval-funktioon. Se pysähtyy hiljaa, kun palvelin nukkuu tai käynnistyy uudelleen, ja tuplaantuu, kun kaksi kopiota ajaa. - Suojaamaton cron-päätepiste. Kuka tahansa, joka sen löytää, voi käynnistää töitäsi tai sähköpostilaskusi.
- Töitä, jotka eivät ole idempotentteja. Uudelleenyrityksiä ja kaksoiskutsuja ajastimelta tulee. Suunnittele niitä varten.
- Ei näkyvyyttä virheisiin. Työ, joka epäonnistuu hiljaa viikon ajan, on pahempi kuin se, joka epäonnistuu äänekkäästi. Kirjaa virheet ja hälytä toistuvista epäonnistumisista.
- Pitkät ajot yhdessä pyynnössä. Pyynnöt aikakatkaistaan. Käsittele erissä.
- Liian tiheä ajastus. Jokainen kutsu nollaan skaalautuvalla alustalla herättää ja laskuttaa sovelluksen. Sovita väli todelliseen tarpeeseen.
- Aikavyöhykkeet. "Klo 9" tarkoittaa eri asiaa ajastimellesi (usein UTC) ja käyttäjillesi. Tallenna ajat UTC:nä ja muunna käyttäjäkohtaisesti.
- Salaisuudet työnkulkutiedostossa. Pidä tunnukset ajastimen salaisuusvarastossa. Katso kuinka pitää API-avaimet turvassa.
Tarkistuslista
- Hidas työ on siirretty pois käyttäjien pyynnöistä
- Työt on tallennettu kestävästi, eivät vain muistiin
- Uudelleenyritykset kasvavilla viiveillä ja enimmäismäärällä
- Jokainen työ on turvallinen ajaa kahdesti
- Ajastettu päätepiste on suojattu salaisella tunnuksella
- Jokainen ajo käsittelee rajatun erän
- Epäonnistuneet työt näkyvät ja niistä hälytetään
- Ajastusväli on valittu hosting-kustannukset huomioiden
- Ajat on tallennettu UTC:nä
Taustatyöt Mythexissä
Mythexin dokumentaatio ei kuvaa ajastettuja töitä tai cron-töitä, ja julkaistut sovellukset ja niiden tietokannat nukkuvat käyttämättöminä ja heräävät seuraavalla pyynnöllä (katso Hosting-rajat). Älä siis luota sovelluksesi sisäisiin ajastimiin. Toimiva tapa on yllä kuvattu: pyydä agenttia luomaan työtaulu ja tunnuksella suojattu päätepiste, ja osoita sitten ulkoinen ajastin julkaistuun URL-osoitteeseesi. Tallenna tunnus projektin salaisuutena ja muista, että jokainen herätys kuluttaa krediittejä sen ajan, jonka sovellus ja tietokanta ovat hereillä, joten valitse järkevä väli. Jos sovelluksesi tarvitsee tähän API-taustajärjestelmän, REST API -taustajärjestelmän resepti on hyvä lähtökohta, ja kuinka rakentaa REST API kattaa päätepisteiden suunnittelun. Jos tuotteesi ydin on jatkuvasti käynnissä olevia työntekijöitä tai botteja, prosesseille rakennettu alusta voi sopia sinulle paremmin.
Kysymykset
Mikä on taustatyö?
Taustatyö on työtä, jonka sovelluksesi tekee käyttäjän odottaman pyynnön ulkopuolella, kuten sähköpostien lähettäminen, kuvien muuttaminen kokoon, raporttien luominen tai tietojen synkronointi. Käyttäjä saa nopean vastauksen, työ ajetaan erikseen, ja sitä voi yrittää uudelleen, jos se epäonnistuu.
Miten ajan ajastetun tehtävän, jos hostini ei tarjoa cronia?
Lisää suojattu päätepiste, joka tekee työn, ja anna ulkoisen ajastimen kutsua sitä aikataulun mukaan. Vaihtoehtoja ovat ajastettu GitHub Actions -työnkulku, hallittu cron-palvelu tai pilvipalveluntarjoajasi ajastin. Suojaa päätepiste salaisella tunnuksella.
Voinko käyttää setInterval- tai setTimeout-funktiota ajastettuihin töihin?
Vain pieniin, tärkeydeltään vähäisiin tehtäviin palvelimella, joka on aina käynnissä. Jos palvelin käynnistyy uudelleen, skaalautuu nollaan tai ajaa useita kopioita, ajastimet katoavat tai ajetaan useammin kuin kerran. Tallenna ajastetut työt tietokantaan tai käytä ajastinta.
Tukeeko Mythex cron-töitä?
Mythexin dokumentaatio ei kuvaa ajastettuja töitä tai cron-töitä, ja julkaistut sovellukset nukkuvat käyttämättöminä. Luotettava tapa on ulkoinen ajastin, joka kutsuu suojattua päätepistettä sovelluksessasi; se herättää sovelluksen ja ajaa työn.