Oppaat

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

VaihtoehtoMiten se toimiiHyvääHuonoa
Käynnistä ja unohda samassa prosessissaVastaa, jatka työtä palvelimessaEi asennustaKatoaa, jos palvelin pysähtyy; ei uudelleenyrityksiä
Prosessin sisäinen ajastin (setInterval, setTimeout)Ajastin käynnissä olevassa palvelimessaTriviaaliEi aja nukkuessa; kaksoiskappaleet useilla kopioilla
Tietokantapohjainen jonoTyöt tallennetaan riveinä; työntekijä ottaa ja ajaa neKäyttää olemassa olevaa tietokantaa; kestävä; helppo tarkastaaRakennat itse uudelleenyritykset ja lukitukset; tarvitsee jotain, joka ajaa työntekijän
Erillinen jono (Redis-pohjainen tai hallittu)Jonopalvelu ja työntekijätKypsät uudelleenyritys- ja ajastusominaisuudetToinen palvelu ajettavaksi ja maksettavaksi
Hallittu työ- tai työnkulkupalveluKolmas osapuoli kutsuu päätepisteitäsi uudelleenyrityksillä ja aikatauluillaAjastus ja uudelleenyritykset hoituvat puolestasiToimittajariippuvuus; toinen tili ja avain
Ulkoinen ajastin, joka kutsuu päätepistettäAjastin muualla lähettää HTTP-pyynnön aikataulun mukaanToimii millä tahansa alustalla, myös skaalautuvilla nollaanVähimmäisvälit ja viiveet; suojaa päätepiste
Alustan oma cronAlusta ajaa komennon aikataulun mukaanYksinkertainen siellä, missä se onKaikki 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:

  1. Luo jobs-taulu: tyyppi, payload (JSON), tila (pending, running, done, failed), yritykset, run_after, last_error, aikaleimat.
  2. Kun jotain tapahtuu, lisää työrivi samassa transaktiossa kuin muutos, joka sen aiheutti, jotta ne onnistuvat tai epäonnistuvat yhdessä.
  3. Työntekijä poimii erääntyneet työt, merkitsee ne running-tilaan, tekee työn ja merkitsee ne done-tilaan.
  4. Epäonnistuessa kasvata attempts-arvoa, aseta run_after myö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:

  1. Lisää päätepiste, kuten POST /api/cron/send-reminders.
  2. Suojaa se: vaadi salainen tunnus otsikossa, tallennettuna salaisuutena molemmilla puolilla, ja hylkää kaikki muu.
  3. Tee siitä idempotentti: kahden ajon samassa minuutissa ei saa lähettää kahta muistutusta. Kirjaa, mitä lähetettiin.
  4. Pidä jokainen kutsu lyhyenä: käsittele erä (esimerkiksi 100 kohdetta) ja anna seuraavan kutsun ottaa loput.
  5. 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.

Mythex · Pricing · Rakenna mitä tahansa tekoälyllä · Verkkosivu- ja sovellusmallipohjat · Mythex vertailussa · Tekoälysovellusten rakentamisen sanasto · Ilmaiset työkalut tekoälysovellusten rakentamiseen · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)