Kuidas Laravelis järjekordi samm-sammult peatada ja hallata

Viimane uuendus: 5 detsember 2025
  • Laravel pakub ühtset järjekorra API-t mitme draiveriga (andmebaas, Redis, SQS…) ning ühenduste ja loogiliste järjekordade eraldamist.
  • Tööd võimaldavad raskete ülesannete taustale viimist, toetades mudelite serialiseerimist, vahetarkvara, ühekordseid töid, krüptimist, partiisid ja stringe.
  • Töötajaid hallatakse käskudega queue:work, Supervisor ja käsud nagu queue:pause/queue:continue, mis kontrollivad uuesti proovimist, ajalõpusid ja prioriteete.
  • On olemas täielik ökosüsteem tõrgete, jälgimise ja testimise jaoks (failed_jobs, queue:retry, queue:monitor, Queue::fake), mis muudab järjekorrad tootmises usaldusväärseks.

Järjekordade haldamine Laravelis

Laravelis järjekordadega töötamine on peaaegu kohustuslik igas vähegi tõsisemas projektis: meilide saatmine, CSV-failide töötlemine, PDF-ide genereerimine, piltide suuruse muutmine, väliste API-de kutsumine... Kui kõik see tehakse peamise HTTP-päringuga, muutub veebisait aeglaseks, ilmub 500 viga ja kasutaja jõllitab meeleheitlikult tühja ekraani.

Hea uudis on see, et Laravel pakub võimsat ja paindlikku järjekordade infrastruktuuri , mis võimaldab teil delegeerida raske töö taustaprotsessidele, hallata neid prioriteedi järgi, grupeerida partiidesse, jälgida, uuesti proovida, kui need ebaõnnestuvad, ja isegi töötajaid ajutiselt hoolduseks peatada . Vaatame lähemalt (ja ärge jätke midagi välja), kuidas sellest maksimumi võtta, sealhulgas kuidas peatada, jätkata ja juhtida selle käitumist tootmises.

Põhimõisted: ühendused, järjekorrad ja draiverid

Laravelis tuleb enne millegi peatamist aru saada erinevusest järjekorraühendused ja järjekorrad ise. Sisse config/queue.php sul on massiiv connections kus defineerite iga taustaprogrammi: andmebaas, redis, beanstalkd, sqs, sünkroonimine, null, tõrkesiire, rabbitmq (kui sa selle lisad) jne.

Igal ühendusel võib olla mitu loogilised järjekorrad (nimed nagu default, emails, high, low, importsAtribuut queue Iga ühendus näitab, milline on vaikimisi järjekord, kuhu tööd lähevad, kui midagi muud pole määratud. onQueue()Sel viisil saate teha selliseid asju nagu:

  • Kiire järjekord e-kirjade või lühikeste tehingute jaoks.
  • Veel üks madal prioriteet pikkade ülesannete jaoks, näiteks videote või mahukate aruannete töötlemiseks.
  • Ülesande tüübi järgi segmenteeritud järjekorrad: imports, notificaciones, reportesJne

Kui käivitate töötaja koos php artisan queue:workVaikimisi kuulab see määratud järjekorda vaikimisi valitud ühendusel. Prioriseerimiseks võite edastada mitu komadega eraldatud järjekorda:

php artisan queue:work redis --queue=high,default,low

Sel viisil töötleb töötaja esmalt kõrgeid väärtusi , seejärel vaikeväärtusi ja alles seejärel madalaid väärtusi , mis on süsteemi laadimise ajal ülioluline ja te ei soovi, et 30-minutiline aruanne blokeeriks kõrge prioriteediga e-kirju.

Järjekorra juhid ja eeltingimused

Laravel pakub mitme järjekorra draiveri jaoks ühtset API-t , kuid igal neist on oma spetsiifilised funktsioonid ja sõltuvused. Enne töötajate pauside arutamist on oluline valida õige draiver.

Draiverite andmebaas

Juht andmebaas See salvestab tööd SQL-tabelisse (tavaliselt jobsSeda on lihtne seadistada ja see sobib ideaalselt väikestele projektidele või arenduskeskkondadele, kus te ei soovi Redise või SQS-iga jännata.

Põhietapid:

  • Genereerige migratsioon: php artisan queue:table (või uuemates versioonides on see järgmine create_jobs_table vaikimisi).
  • Käivita migratsioonid: php artisan migrate.
  • Seadista QUEUE_CONNECTION=andmebaas sisse .env ja kinnitage sisse config/queue.php et 'default' => env('QUEUE_CONNECTION','database').

See on mugav ja piisavalt töökindel, kuid paljude järjekordade ja suure liikluse tõttu võib see muutuda pudelikaelaks , kuna kõik käib läbi sama relatsioonandmebaasi.

Draiver Redis

Redise draiver on tootmiskeskkonnas standardne tööloom. See on kiire, toetab täiustatud funktsioone (lukustamine, kiiruse piiramine, aatomlukud, Horizon jne) ja skaleerub väga hästi.

Olulised punktid:

  • Peate Redis-ühenduse konfigureerima config/database.php.
  • Valikud serializer y compression Redise käest Need ei ühildu järjekorrajuhiga.
  • Kui kasutate Redise klasterJärjekordade nimedel peab olema räsimärk, näiteks {default}nii et kõik selles järjekorras olevad võtmed satuvad samasse pessa.
  • Valik block_for See võimaldab töötajal blokeerida, oodates tööülesandeid mõne sekundi jooksul, selle asemel, et pidevalt küsitleda: säästab protsessorit ja vähendab päringute arvu Redise serverisse.

Näiteks:

'redis' => ,

Kui sa paned plokk_jaoks = 0Töötaja jääb määramata ajaks blokeerituks, kuni töökoht vabaneb, mida tuleks meeles pidada, kui soovite, et see reageeriks kiiresti sellistele signaalidele nagu SIGTERM või pausi käske.

Muud draiverid: SQS, Beanstalkd, null, tõrkesiire…

Lisaks andmebaasidele ja redisidele toetab Laravel ka teisi süsteeme :

  • Amazon SQSHallatud järjekorrad AWS-is, mis toetavad FIFOSõnumigrupid, dubleerivate andmete eemaldamine ja täpsemad nähtavuse seaded. Nõuab SDK-d. aws/aws-sdk-php.
  • BeanstalkdVäga kiire ja lihtne, kasutades paketti pda/pheanstalk.
  • sünkroonida: täidab ülesandeid inmediately samas protsessis. Kasulik arenduses või testimises, aga tootmises on see praktiliselt sama, mis järjekordade üldse mittekasutamine.
  • tühjaks: Tühistab tööd kohe, kui need on "välja saadetud". Kasutatakse järjekorrasüsteemi täielikuks keelamiseks.
  • failoverSee võimaldab teil konfigureerida mitu ühendust ja kui peamine ühendus ebaõnnestub, proovib Laravel töö järgmisele loendis olevale ühendusele edasi lükata. Ideaalne keskkondade jaoks, kus kõrge kättesaadavus on kriitiline.
  Electron JS: kõik, mida pead teadma

Töötajate peatamise ja jätkamise tasandil on loogika praktiliselt sama olenemata draiverist, sest seda hallatakse Artisan käskude ja Worker klassi , mitte järjekorra taustsüsteemi kaudu.

Töökohtade loomine ja mudeli serialiseerimine

Un töö Laravelis on see lihtsalt klass, mis kapseldab järjekorras täidetava ülesande. Tavaliselt genereeritakse see Artisaniga ja salvestatakse kausta app/Jobs.

Selle loomiseks tehke järgmist.

php artisan make:job ProcessPodcast

Genereeritud klass rakendab ShouldQueue ja kasutab tavaliselt omadusi Dispatchable, InteractsWithQueue, Queueable y SerializesModelsSüda peitub meetodis handle()mida töötaja teeb, kui töö saabub.

Eriti võimas funktsioon on Eloquenti mudelite automaatne serialiseerimine . Kui aktsepteerite mudeli Job konstruktoris, ei lisa Laravel järjekorda kogu objekti, vaid ainult selle identifikaatorit. Kui job töödeldakse, rekonstrueerib see mudeli andmebaasist koos selle seostega.

Tüüpiline näide (pseudokoodis, et vältida sõna-sõnalt kordamist):

  • Ehitaja saab Podcast $podcast.
  • Omadus SerializesModels See vastutab ID salvestamise eest.
  • En handle(AudioProcessor $processor) Sina teed raske töö ära (näiteks töötled heli).

Kui te ei soovi, et mudeli seosed oleksid serialiseeritavad (nii et kasulik koormus poleks tohutu), saate kasutada $model->withoutRelations() või PHP 8-s atribuut # ehitaja poolt reklaamitud kinnistul.

Sõltuvuste süstimine käepidememeetodisse

Teine eelis on see, et saate süstige teenused otse käepidememeetodisse (justkui oleks tegemist kontrolleriga), sest Laravel kasutab teenuse konteinerit ka Jobsis. Näiteks saate taotleda AudioProcessorHTTP-kliendid, repositooriumid jne ning raamistik hoolitseb nende lahendamise eest.

Kui vajate ülitäpset kontrolli nn. handlesaate kasutada Container::bindMethod() teenusepakkujas ja defineerida süstimisloogika ise, aga enamasti pole vaja asju nii keeruliseks ajada.

Töö vahevara

Nii nagu marsruutidel on vahetarkvara, võivad ka töödel olla spetsiifiline vahevara mis töötavad enne ja pärast tööd. See vähendab oluliselt korduvat koodi meetodites handle() ja see on eriti kasulik järgmistel juhtudel:

  • Kiiruse piiramine koos Redisega.
  • vältima kattuvad teoseid, mis puudutavad sama ressurssi.
  • Regulaarsed erandid ebastabiilsete API-de puhul.
  • Tööde vahelejätmine teatud tingimustel (Skip vahevara).

Vahevara paigutatakse tavaliselt app/Jobs/Middleware ja meetodist tagastatakse middleware() Iiobi raamatust. Kontseptuaalne näide:

public function middleware(): array { return ;

Eritüüpi tööd: unikaalsed, krüpteeritud ja lukustatud

Laravel võimaldab teil teatud töid märkida kui ainulaadne tagamaks, et kahte identset eksemplari ei satuks kunagi korraga järjekorda. See saavutatakse liidese rakendamisega ShouldBeUnique o ShouldBeUniqueUntilProcessingja toetab võtme määratlemist uniqueId() ja aeg uniqueFor.

See on ideaalne selliste asjade jaoks nagu:

  • Toote otsinguindeksi uuesti arvutamine: ainult üks kord toote kohta kuni see lõpeb.
  • Sünkroniseerimine väliste teenustega, mis ei luba sama ressursi samaaegseid päringuid.

Selle all kasutab Laravel a aatomilukk vahemälust (Redis, memcached, andmebaas jne). Samuti saate selle luku jaoks vahemälu draiveri valida uniqueVia().

Lisaks on olemas liides ShouldBeEncrypted, millega te näitate, et kogu töö on Sisesta oma kood enne järjekorda minekutVäga kasulik tundlike andmete edastamisel, kui te ei soovi, et need liiguksid lihttekstina läbi Redise, SQS-i või andmebaasi.

Tööde saatmine, edasilükkamine ja täitmine erinevates režiimides

Kui teie töö on määratletud, käivitate selle Job::dispatch() kontrolleritest, sündmuste kuulajatest, Artisani käskudest või isegi sulgemistest. Parameetrid, mille sa kellelegi edastad dispatch Nad lähevad otse Iiobi ehitaja juurde.

Huvitavad variatsioonid:

  • dispatchIf() y dispatchUnless() saadetise konditsioneerimiseks ühel real.
  • delay() nii et tööd ei saa töödelda enne kindlat kuupäeva/kellaaega.
  • dispatchAfterResponse() o afterResponse() en dispatch() Sulgemised, mis lükkavad täitmise edasi kuni HTTP-vastuse saatmiseni, kuid sama PHP protsessi piires.
  • dispatchSync() Jobi sünkroonselt käivitama (järjekorda läbimata), kuid sama klassi uuesti kasutades.
  • Spetsiaalsed ühendused, näiteks deferred o background käivitamiseks pärast vastust, samas protsessis või uues PHP protsessis.

Lõpuks saate ühenduse ja järjekorra määrata aheldatud meetodite abil. onConnection() y onQueue()kas lähetamise ajal või töö koostaja sees.

Peenkontroll: uuestikatsed, taganemisperioodid, ajalõpud ja veakäsitlus

Laraveli järjekordadega töötamise suur osa on otsustada, mitu korda tööd uuesti proovida , kui kaua katsete vahel oodata ja millal seda ebaõnnestumiseks lugeda.

  Mis on esiotsa arendaja ja mida nad teevad?

Saadaolevad valikud:

  • --tries en queue:work et määrata selle töötaja kõigi tööde maksimaalne katsete arv (välja arvatud juhul, kui töö määratleb oma) $tries o tries()).
  • $tries või meetod tries() Job-klassis Job-põhise kontrolli jaoks.
  • retryUntil() öelda: „proovi uuesti nii palju kui tahad, kuni selle ajani, pärast seda on see läbikukkumine.“ Kui see langeb kokku tries, käsk retryUntil.
  • $maxExceptions katkestama, kui probleemi põhjuseks on korduvad käsitlemata erandid.
  • $timeout o --timeout et näidata, mitu sekundit saab Job töötada enne, kui töötaja lapseprotsessi tapab.
  • $failOnTimeout töö ajalõpu korral nurjunuks märkimiseks.
  • $backoff meetod backoff() et määrata, kui kaua uuesti proovimiste vahel oodata, isegi eksponentsiaalsete väärtuste korral.

Kui töö viskab tabamata erandi, siis Laravel... laseb tagasi sabasse kuni konfigureeritud katsed on ammendunud. Saate seda käsitsi juhtida, kasutades release($segundos) o fail($exception) kui soovite töö tahtlikult nurjunuks märkida.

Ebaõnnestunud tööd, failed_jobs tabel ja kärpimine

Kui Iiob oma katsed ammendab, hakatakse teda pidama ebaõnnestunud töö ja Laravel lisab selle tabelisse failed_jobs (või DynamoDB-s, kui te selle nii konfigureerite). See tabel salvestab UUID-i, ühenduse, järjekorra, töö koormuse ja tekkinud erandi.

Kasulikud käsud:

  • php artisan queue:failed ebaõnnestunute loetlemiseks.
  • php artisan queue:retry <id|all> et neid uuesti proovida.
  • php artisan queue:forget <id> ühe kustutamiseks.
  • php artisan queue:flush kõigi kustutamiseks (uuemates versioonides on tundide valikuvõimalus).
  • php artisan queue:prune-failed --hours=48 vanade kirjete automaatseks kärpimiseks.

Töökohtades saate defineerida meetodi failed(Throwable $exception) Lisapuhastuseks: teavitage kasutajat, tühistage osalised toimingud, kirjutage spetsiaalsed logid jne. Pange tähele, et Jobi kutsumiseks luuakse uus eksemplar. failed()Seetõttu ärge lootke tehtud kinnisvaramuudatustele handle().

Tööde partieerimine: tööde partiid ja nende kombineerimine stringidega

Kui teil on vaja käivitada sadu või tuhandeid omavahel seotud töid (näiteks importida hiiglaslikku CSV- faili tükkidena, töödelda faile partiidena, puhastada andmeid jne), on soovitatav kasutada Laraveli partiitöötlusfunktsiooni.

Põhivoog:

  • loo tabel job_batches koos php artisan queue:batches-table && php artisan migrate.
  • Märkige töökohad, mis kuuluvad tunnusega partiidesse Batchable.
  • Kasutama Bus::batch() saata Jobide komplekt koos tagasihelistustega then, catch y finally.
  • Ligipääs iga töö partiile, kasutades $this->batch() ja kontrollige, kas see on tühistatud.
  • Võimalus lisada käimasolevale partiile rohkem töid koos $this->batch()->add().

Partiid integreeruvad kettidega suurepäraselt : kette saab luua partii sees või partiisid suurema keti elementidena. See on eriti kasulik siis, kui soovite, et mitu ketti töötaksid "paralleelselt" ja käivitaksid midagi pärast nende kõigi valmimist.

Töötajate täitmine, prioriteedid ja paigutamine

Kogu järjekordade võlu toimub tänu sellele, et sul on üks või mitu töötajat käsu käivitamine queue:work (o queue:listen(kuigi viimane on vähem efektiivne). Need protsessid on pikalt töötavad deemonid, mis kuulavad oma vastavaid järjekordi.

Peamised valikud queue:work:

  • Conexión: php artisan queue:work redis, queue:work databaseJne
  • Colas: --queue=high,default,low tähtsuse järjekorda seadma.
  • -üksteist: töötleb ühe töö ja väljub.
  • –max-jobs: töötleb X tööd ja lõpetab selle (töötajate perioodiliseks taaskäivitamiseks ja mälu vabastamiseks).
  • –max-aeg: töötleb N sekundit ja seejärel väljub.
  • –uni: sekundiline ooteaeg, kui töökohti pole saadaval.
  • –peatu-kui-tühi: tühjendab järjekorra ja sulgub puhtalt (ideaalne Dockeri keskkondades või ühekordsete tööde puhul).
  • –aeg: sekundid ajalõpu töö kohta, nagu me varem mainisime.
  • - jõudu: tööde töötlemiseks isegi siis, kui rakendus on hooldusrežiimis.

Kuna need protsessid on pikalt töötavad, kasutatakse tootmiskeskkonnas X-töötajate käivitamiseks, nende krahhi korral taaskäivitamiseks ja logide haldamiseks peaaegu alati protsesside monitori , näiteks Supervisorit (Linuxis). Tüüpiline Laraveli Supervisori konfiguratsiooniplokk määratleb:

  • käsk koos php artisan queue:work ... betoonist.
  • numprocs et näidata, mitu töötajat paralleelselt käivitada.
  • Logiteed, kasutaja, automaatsed taaskäivitused jne.

Järjekordade peatamine ja jätkamine Laravelis

Vaatame, mis on hoolduses sageli oluline: kuidas järjekorras olevaid töötajaid peatada ilma neid järsku peatamata ja töid pooleli jätmata. Laravel pakub selle juhtimiseks mitmeid mehhanisme, mõned uuemad, mõned klassikalised.

Paus: järjekord: paus ja katkestussignaalid

Uuemates versioonides on Laravel lisanud konkreetsed käsud töötajate täitmise peatamiseks ja jätkamiseks :

  • php artisan queue:pause: käsib süsteemil uute tööde võtmise lõpetada, kuid lasta juba pooleliolevatel töödel lõpule viia.
  • php artisan queue:continue: jätkab uute tööde töötlemist sealt, kus see pooleli jäi.
  Variatsiooni inflatsiooniteguri (VIF) arvutamine C# ja tarkvara disainis

Need käsud toimivad nii, et saadavad töötajatele signaale Laraveli sisemiselt kasutatava vahemälumehhanismi kaudu. Seetõttu on oluline, et vahemälu draiver (memcached, redis, database, file jne) oleks õigesti konfigureeritud, isegi kui teie tegelik vahemälu järjekord on midagi muud.

Tähtis: Järjekorra või töötaja peatamine ei tühista ega kustuta juba järjekorras olevaid töid ; see lihtsalt takistab järjekorrast uute tööde eemaldamist pausi ajal.

Häirete ja nende mõju tulemuslikkusele küsitlus

Iga kord, kui töötaja töö lõpetab, kontrollib Laravel vahemälu taaskäivitamise, pausi või jätkamise signaalide suhtes . Selle kulu on tühine, kuid see on olemas. Kui olete äärmiselt keskendunud jõudlusele ja teate, et te ei pea töötajaid käskudest pausima ega taaskäivitama, saate selle küsitluse keelata, kutsudes välja:

Queue::withoutInterruptionPolling();

Või isegi reguleerida staatilisi omadusi Illuminate\Queue\Worker teatud puudutuste keelamiseks ($taaskäivitatav, $pausitatavKui te seda aga teete ja seejärel proovite kasutada queue:pause o queue:restarttöötajad Nad ei saa teadaSee on disainiotsus, mida tuleks hoolikalt kaaluda.

Peatage käsitsi Supervisori või Dockeriga

Lisaks Laraveli enda käskudele peatatakse tootmiskeskkondades protsesse sageli kaudselt:

  • Programmi peatamine superviisoris (supervisorctl stop laravel-worker:*), mis tapab või peatab töötajad.
  • kasutamine –peatu-kui-tühi juurutustes, et töötajad saaksid järjekorras olevad tööd lõpetada ja seejärel töö lõpetada.
  • Dockeris konteineri töötlemise lubamine koos --stop-when-empty ja siis see lülitub välja.

Erinevus queue:pause Protsesside täieliku peatamisega peatate tööde töötlemise kuni töötajate taaskäivitumiseni. sisemine paus Saate protsesse mällu hoida, käsku oodates continueSee on kasulik kiirete tagasipööratavate juurutuste või lühikeste hooldusperioodide korral.

Andmebaasi tehingud ja after_commit

Klassikaline viga: tööde saatmine andmebaasitehingute sees . Kui te pole ettevaatlik, võib töötaja töö enne commit'i tegemist käivitada ja oodatud mudel või andmed ei pruugi veel andmebaasis olla.

Selle tantsu vältimiseks on teil kaks võimalust:

  • Aktiveerima 'after_commit' => true järjekorra ühenduse konfiguratsioonis. Seega lükatakse iga tehingu raames saadetud töö (Job) sisemiselt edasi kuni selle kinnitamiseni.
  • Kasutage tööpõhiseid meetodeid afterCommit() o beforeCommit() saatmisel, et sundida käitumist ainult teatud töödes.

Kui tehing tühistatakse, siis selle käigus saadetud tööd visatakse ära ilma järjekorda lisamata, mis ongi tavaliselt järjepidevuse säilitamiseks soovitud tulemus.

Jälgimine, järjekordade puhastamine ja testimine

Kui järjekorrad on juba korralikult tööle hakanud, ei piisa ainult töökohtade äraviskamisest ja nende unustamisest; tuleks jälgida ja testida, kuidas kõik toimib.

Kasulikud tööriistad ja käsud:

  • queue:clear konkreetse järjekorra tühjendamiseks (SQS, Redis, andmebaas).
  • queue:monitor teatud järjekordades olevate tööde arvu jälgimiseks ja sündmuse käivitamiseks QueueBusy kui nad ületavad läve.
  • Tööüritused kui Queue::before, Queue::after, Queue::looping y Queue::failing kohandatud loogika (logid, mõõdikud, tagasipööramised jne) ühendamiseks.
  • Võltsingud testimisel kasutamine Queue::fake() y Bus::fake() et kontrollida, kas Jobid, stringid või partiid on saadetud välja ilma neid tegelikult käivitamata.

Testides saab väita näiteks, et „seda tööd on järjekorras X korda pandud” , „nende töödega ahel on saadetud välja selles järjekorras” või „ühtegi konkreetset tööd pole järjekorras pandud”, mis pakub keerukates voogudes palju turvalisust.

Kogu selle ökosüsteemiga – draiverid nagu Redis või SQS, hästi disainitud töökohad, peenhäälestamiseks mõeldud vahevara, partiid, ahelad, uuesti proovimise konfiguratsioon, juhendaja hallatavad töötajad ja käsud nagu queue:pause y queue:continue— Laravel võimaldab teil millimeetri täpsusega hallata taustatöötlust, alates tavapärasest e-kirjade saatmisest kuni hajutatud järjekorra arhitektuurideni koos tõrkesiirdega, tagades, et teie rakendus reageerib HTTP-kihil kiiresti, samal ajal kui allpool tehakse rasket tööd, ilma kasutajat blokeerimata.

Laraveli raamistik
Seotud artikkel:
Võimas Laraveli raamistik