Laravel 13.31 inaongeza kazi zinazoweza kusitishwa (interruptible jobs), ikiruhusu wafanyakazi wa foleni (queue workers) kupokea ishara ya SIGTERM inayotumwa wakati wa utoaji (deployments) na kuzima kwa utulivu badala ya kukatisha kazi nusu njia. Timu zinazoendesha kazi za muda mrefu—kuchakata safu mamia ya maelfu, kutuma barua pepe za jumla, au kutengeneza ripoti—zitafaidika kwa sababu data inabaki kuwa thabiti wakati toleo jipya linatolewa.

Kwa nini utoaji (deployments) umekuwa ukiharibu kazi

Wakati toleo jipya linapoingia, wasimamizi wa michakato kama vile Supervisor, Docker, na Kubernetes huambia wafanyakazi waliopo waache kwa kutuma SIGTERM, ombi la adabu la kusitisha. Wafanyakazi wengi husubiri kazi ya sasa imalize kabla ya kutoka. Tatizo hutokea wakati meneja anapotoa sekunde chache tu za kutii. Ikiwa kazi inahitaji dakika kadhaa, meneja huongeza nguvu na kutumia SIGKILL, ambayo huua mchakato papo hapo. Kazi hiyo haifikii hali thabiti, na kuacha rekodi zilizosasishwa nusu, faili zilizosalia bila mpangilio (orphaned files), au kazi zinazojirudia.

Jibu la Laravel: usitishaji wa ushirikiano (cooperative interruption)

Laravel 13.31 inatambulisha mkataba (contract) unaitwa Interruptible ambao darasa la kazi (job class) linaweza kutekeleza ili kutambua ombi la kusitisha. SIGTERM inapofika, Laravel huita njia ya interrupted() ya kazi hiyo. Framework hii haizimi kazi kiotomatiki; kazi lazima ikague alama (flag) ambayo Laravel huweka na kujiondoa yenyewe. Mfumo huu wa ushirikiano unawawezesha watengenezaji kumaliza mzunguko wa sasa wa kazi (loop iteration), kurudisha nyuma mabadiliko ya sehemu (roll back), au kuandika sehemu ya kumbukumbu (checkpoint) kabla ya kuacha.

Jinsi ya kufanya kazi iwe inazoweza kusitishwa

  1. Tekeleza mkataba – ongeza implements Interruptible kwenye utambulisho wa darasa la kazi.
  2. Kagua alama (flag) ndani ya mzunguko wa kazi – weka ukaguzi katika kila mzunguko ili kuona ikiwa kazi inapaswa kusimama.
  3. Fanya usafishaji – katika interrupted(), huhifadhi hali yoyote itakayoruhusu kazi kuendelea baadaye, au weka kumbukumbu ya usitishaji kwa ajili ya uchambuzi wa baadaye.

Mtego mkubwa zaidi: usitumie --once

Kuendesha mfanyakazi wa foleni kwa kutumia php artisan queue:work --once huzima kabisa usimamizi wa ishara (signal handling). Mfanyakazi huchakata kazi moja na kutoka, lakini haujasajili kamwe msimamizi wa SIGTERM. Matokeo yake, kazi yoyote inayoweza kusitishwa hupuuza ombi la kusitisha na kuuawa katikati ya mchakato. Mtindo huu huonekana katika kontena zinazoendeshwa na cron na utoaji wa mara moja (one-shot deployments). Irekebishe kwa kuendesha hali ya daemon (php artisan queue:work) kila unapohitaji kazi zinazoweza kusitishwa.

Kufuatilia usitishaji

Laravel hutoa matukio (events) mawili unayoweza kuunganishwa nayo:

  • WorkerInterrupted – hutolewa kila wakati mfanyakazi wowote unapopokea SIGTERM. Kuweka kumbukumbu ya tukio hili kunatoa mtazamo wa juu wa jinsi mara kwa mara utoaji unavyozima wafanyakazi.
  • JobInterrupted – hutolewa tu ikiwa kazi ya sasa imetekeleza mkataba wa Interruptible. Tumia tukio hili kuchochea usafishaji maalum wa kazi, kama vile kufuta faili za muda au kusasisha alama ya “safu iliyochakatwa mwisho”.

Kusikiliza matukio haya kunaruhusu timu kujenga dashibodi zinazoonyesha athari za utoaji na kutambua kazi ambazo mara kwa mara hukatwa nusu.

Ripoti ya ukubwa wa foleni imeboreshwa kidogo

Utoaji huu unaongeza njia ya totalSize() kwenye meneja wa foleni, inayorudisha jumla ya kazi zinazosubiriwa katika foleni zote. Thamani hii ni ya kuaminika kwa viendeshi (drivers) vya database na Redis, ambavyo huripoti idadi halisi. Viendeshi kama SQS, Sync, na Beanstalkd bado hurudisha sifuri kwa sababu haviwezi kuonyesha idadi kupitia API ya Laravel. Timu zinazotumia SQS zinapaswa kuendelea kutegemea vipimo vya CloudWatch kwa kina cha foleni (queue depth).

Hii inamaanisha nini kwa mipangilio tofauti

  • Docker/Kubernetes – kipindi cha kuzima kwa utulivu (graceful shutdown) sasa kinaweza kutumiwa kwa ufanisi. Panua kipindi cha utulivu cha kusitisha ili kazi ziwe na sekunde chache za kugundua alama na kuzima kwa utulivu.
  • Supervisor – weka stopwaitsecs ikiwa juu ya muda unaotegemea kazi imalize baada ya kupokea alama ya usitishaji.
  • Kazi za zamani (Legacy jobs) – kagua kazi yoyote inayochukua muda mrefu kuliko muda wa kusubiri (timeout) wa meneja na, pale inapowezekana, ifanye iwe inazoweza kusitishwa.

Upande mwingine: ugumu unaoongezeka

Sifa hii haichukui nafasi ya usanidi sahihi wa muda wa kusubiri (timeout). Ikiwa mzunguko wa kazi hautakagua alama ya usitishaji, meneja bado atatuma SIGKILL. Timu lazima ikague njia za kodi zinazochukua muda mrefu na kuweka ukaguzi katika mivuto ya kimantiki (logical breakpoints). Baadhi ya watengenezaji wanaweza kuona kodi za ziada (boilerplate)—kutekeleza mkataba na kuongeza ukaguzi wa alama—kama kitu kisichovutia kwa kazi fupi ambazo tayari hukamilika ndani ya dirisha la kuzima.

Orodha ya hatua za kuchukua

  1. Kagua skripti za deployment ili kutafuta alama ya --once na uibadilishe kuwa daemon mode ambapo kazi zinazoweza kusitishwa zinatumiwa.
  2. Tambua kazi zinazoendelea kwa muda mrefu zaidi (zile zinazogusa maelfu ya mistari au zinazoendelea kwa dakika kadhaa) na uongeze Interruptible contract.
  3. Ingiza ukaguzi wa flag ndani ya kila mzunguko wa loop, na uhamishe kodi yoyote muhimu ya kumalizia kwenda kwenye njia ya interrupted().
  4. Unganisha wasikilizaji (listeners) kwenye WorkerInterrupted na JobInterrupted ili kukusanya vipimo (metrics) kuhusu jinsi mara kwa mara deployment zinavyoathiri uchakataji.
  5. Kwa foleni za Redis au hifadhidata, tumia totalSize() kufuatilia backlog; kwa SQS, endelea kutumia kengele za CloudWatch.

Chukulia kuzimwa kwa mifumo kutokana na deployment kama hatua iliyopangwa badala ya kuzimwa ghafla. Laravel 13.31 huweka data kuwa thabiti na kupunguza changamoto za kiutendaji za kazi ambazo hazijakamilika. Faida dhidi ya hasara ni ongezeko kidogo la uwajibikaji wa kodi, lakini timu zinazotegemea uchakataji mzito wa background zinapata mazingira ya uzalishaji (production) yanayoaminika zaidi.