Laravel 13.31 interruptible jobs ను జోడిస్తుంది, దీనివల్ల queue workers డిప్లాయ్‌మెంట్స్ సమయంలో పంపబడే SIGTERM సిగ్నల్‌ను గుర్తించి, పనిని మధ్యలో ఆపేయడానికి బదులుగా క్లీన్‌గా షట్‌డౌన్ అవ్వగలవు. వేల సంఖ్యలో rows ప్రాసెస్ చేయడం, బల్క్ ఈమెయిల్స్ పంపడం లేదా రిపోర్ట్స్ జనరేట్ చేయడం వంటి సుదీర్ఘమైన పనులు చేసే టీమ్స్‌కు ఇది ఎంతో ఉపయోగపడుతుంది, ఎందుకంటే కొత్త రిలీజ్ వచ్చినప్పుడు డేటా కన్సిస్టెంట్‌గా ఉంటుంది.

డిప్లాయ్‌మెంట్స్ వల్ల జాబ్స్ ఎందుకు ఆగిపోతున్నాయి

కొత్త వెర్షన్ వచ్చినప్పుడు, Supervisor, Docker, మరియు Kubernetes వంటి ప్రాసెస్ మేనేజర్లు SIGTERM పంపడం ద్వారా ప్రస్తుతం ఉన్న వర్కర్లను ఆపమని కోరుతాయి. ఇది ముగించమని చేసే ఒక మర్యాదపూర్వక అభ్యర్థన. చాలా వర్కర్లు బయటకు వచ్చే ముందు ప్రస్తుత జాబ్ పూర్తయ్యే వరకు వేచి ఉంటాయి. కానీ మేనేజర్ ఈ ప్రక్రియ కోసం కేవలం కొన్ని సెకన్ల సమయం మాత్రమే ఇస్తే సమస్య మొదలవుతుంది. ఒక జాబ్‌కు కొన్ని నిమిషాల సమయం కావాల్సి వస్తే, మేనేజర్ SIGKILL కి మారుతుంది, ఇది ప్రాసెస్‌ను వెంటనే చంపేస్తుంది. దీనివల్ల జాబ్ సరైన స్థితికి చేరుకోదు, ఫలితంగా పాక్షికంగా అప్‌డేట్ అయిన రికార్డులు, అసంపూర్తిగా మిగిలిపోయిన ఫైల్స్ లేదా డూప్లికేట్ వర్క్ వంటి సమస్యలు తలెత్తుతాయి.

Laravel ఇచ్చే పరిష్కారం: cooperative interruption

Laravel 13.31 లో Interruptible అనే కాంట్రాక్ట్‌ను పరిచయం చేశారు, దీనిని ఒక జాబ్ క్లాస్ ఇంప్లిమెంట్ చేయడం ద్వారా టెర్మినేషన్ రిక్వెస్ట్‌ను గుర్తించగలదు. SIGTERM వచ్చినప్పుడు, Laravel ఆ జాబ్ యొక్క interrupted() మెథడ్‌ను పిలుస్తుంది. ఫ్రేమ్‌వర్క్ జాబ్‌ను ఆటోమేటిక్‌గా ఆపదు; జాబ్ స్వయంగా Laravel సెట్ చేసిన ఫ్లాగ్‌ను తనిఖీ చేసి, ఆపై నిష్క్రమించాలి. ఈ కోఆపరేటివ్ మోడల్ ద్వారా డెవలపర్లు ప్రస్తుత లూప్ ఇటరేషన్‌ను పూర్తి చేయడానికి, పాక్షిక మార్పులను రోల్ బ్యాక్ చేయడానికి లేదా నిష్క్రమించే ముందు ఒక చెక్‌పాయింట్‌ను రాయడానికి వీలవుతుంది.

జాబ్‌ను interruptible గా మార్చడం ఎలా

  1. కాంట్రాక్ట్‌ను ఇంప్లిమెంట్ చేయండి – జాబ్ క్లాస్ డెఫినిషన్‌లో implements Interruptible అని జోడించండి.
  2. వర్క్ లూప్ లోపల ఫ్లాగ్‌ను తనిఖీ చేయండి – జాబ్ ఆగిపోవాలా లేదా అని చూడటానికి ప్రతి ఇటరేషన్‌లో ఒక చెక్ ఉంచండి.
  3. క్లీనప్ చేయండి – interrupted() లో, జాబ్ తర్వాత మళ్ళీ ప్రారంభించడానికి వీలుగా ఏదైనా స్టేట్‌ను సేవ్ చేయండి లేదా విశ్లేషణ కోసం ఆ అంతరాయాన్ని లాగ్ చేయండి.

అతిపెద్ద ఉచ్చు: --once ఉపయోగించకండి

php artisan queue:work --once తో క్యూ వర్కర్‌ను రన్ చేస్తే సిగ్నల్ హ్యాండ్లింగ్ పూర్తిగా నిలిపివేయబడుతుంది. వర్కర్ ఒకే ఒక జాబ్‌ను ప్రాసెస్ చేసి బయటకు వస్తుంది, కానీ అది SIGTERM హ్యాండ్లర్‌ను రిజిస్టర్ చేయదు. దీనివల్ల, ఏ interruptible జాబ్ అయినా టెర్మినేషన్ రిక్వెస్ట్‌ను విస్మరిస్తుంది మరియు ప్రాసెస్ మధ్యలోనే చంపబడుతుంది. ఈ పద్ధతి cron-driven కంటైనర్లు మరియు one-shot డిప్లాయ్‌మెంట్లలో కనిపిస్తుంది. మీకు interruptible జాబ్స్ కావాలన్నప్పుడు డెమొన్ మోడ్ (php artisan queue:work) రన్ చేయడం ద్వారా దీనిని సరిచేయండి.

అంతరాయాలను గమనించడం

Laravel మీరు ఉపయోగించగల రెండు ఈవెంట్‌లను విడుదల చేస్తుంది:

  • WorkerInterrupted – ఏదైనా వర్కర్ SIGTERM అందుకున్న ప్రతిసారీ ఇది విడుదలవుతుంది. ఈ ఈవెంట్‌ను లాగ్ చేయడం ద్వారా, డిప్లాయ్‌మెంట్స్ ఎంత తరచుగా వర్కర్లను అంతరాయం చేస్తున్నాయో తెలుసుకోవచ్చు.
  • JobInterrupted – ప్రస్తుత జాబ్ Interruptible కాంట్రాక్ట్‌ను ఇంప్లిమెంట్ చేసినప్పుడు మాత్రమే ఇది విడుదలవుతుంది. తాత్కాలిక ఫైల్స్‌ను తొలగించడం లేదా “last processed row” మార్కర్‌ను అప్‌డేట్ చేయడం వంటి జాబ్-స్పెసిఫిక్ క్లీనప్‌ను ట్రిగ్గర్ చేయడానికి ఈ ఈవెంట్‌ను ఉపయోగించండి.

ఈ ఈవెంట్‌లను వినడం (listening) ద్వారా, డిప్లాయ్‌మెంట్ ప్రభావాలను చూపే డాష్‌బోర్డ్‌లను నిర్మించడానికి మరియు తరచుగా మధ్యలోనే ఆగిపోయే జాబ్‌లను గుర్తించడానికి టీమ్స్‌కు వీలవుతుంది.

క్యూ సైజ్ రిపోర్టింగ్ మెరుగుదల

ఈ రిలీజ్ క్యూ మేనేజర్‌కు totalSize() అనే మెథడ్‌ను జోడిస్తుంది, ఇది అన్ని క్యూలలో పెండింగ్‌లో ఉన్న మొత్తం జాబ్‌ల సంఖ్యను తిరిగి ఇస్తుంది. ఇది database-backed మరియు Redis డ్రైవర్లకు నమ్మదగినది, ఎందుకంటే అవి ఖచ్చితమైన కౌంట్‌ను రిపోర్ట్ చేస్తాయి. SQS, Sync, మరియు Beanstalkd వంటి డ్రైవర్లు ఇంకా సున్నానే (zero) తిరిగి ఇస్తాయి, ఎందుకంటే అవి Laravel API ద్వారా కౌంట్‌ను బయటపెట్టవు. SQS ఉపయోగించే టీమ్స్ క్యూ డెప్త్ కోసం CloudWatch మెట్రిక్స్‌పై ఆధారపడటం కొనసాగించాలి.

వివిధ సెటప్‌లకు దీని అర్థం ఏమిటి

  • Docker/Kubernetes – గ్రేస్‌ఫుల్ షట్‌డౌన్ పీరియడ్‌ను ఇప్పుడు సమర్థవంతంగా ఉపయోగించుకోవచ్చు. జాబ్స్ ఫ్లాగ్‌ను గుర్తించి క్లీన్‌గా బయటకు రావడానికి కొన్ని సెకన్ల సమయం ఉండేలా టెర్మినేషన్ గ్రేస్ పీరియడ్‌ను పెంచండి.
  • Supervisor – ఇంటరప్ట్ ఫ్లాగ్ అందుకున్న తర్వాత జాబ్ పూర్తవ్వడానికి మీరు ఆశించే సమయం కంటే stopwaitsecs ను ఎక్కువగా సెట్ చేయండి.
  • Legacy jobs – మేనేజర్ టైమ్ అవుట్ కంటే ఎక్కువ సమయం నడిచే ఏ జాబ్‌నైనా సమీక్షించండి మరియు సాధ్యమైన చోట దానిని interruptible గా మార్చండి.

వ్యతిరేక అంశం: అదనపు సంక్లిష్టత

ఈ ఫీచర్ సరైన టైమ్ అవుట్ కాన్ఫిగరేషన్‌కు ప్రత్యామ్నాయం కాదు. ఒక జాబ్ లూప్ ఎప్పుడూ ఇంటరప్షన్ ఫ్లాగ్‌ను తనిఖీ చేయకపోతే, మేనేజర్ ఇప్పటికీ SIGKILL పంపుతుంది. టీమ్స్ లాంగ్-రన్నింగ్ కోడ్ పాత్‌లను ఆడిట్ చేయాలి మరియు లాజికల్ బ్రేక్‌పాయింట్‌లలో చెక్‌లను జోడించాలి. షట్‌డౌన్ విండోలోనే పూర్తయ్యే చిన్న జాబ్స్ కోసం కాంట్రాక్ట్‌ను ఇంప్లిమెంట్ చేయడం మరియు ఫ్లాగ్ చెక్‌లను జోడించడం వంటి అదనపు బాయిలర్‌ప్లేట్ (boilerplate) పనులను కొంతమంది డెవలపర్లు ఇష్టపడకపోవచ్చు.

యాక్షన్ చెక్‌లిస్ట్

  1. డిప్లాయ్‌మెంట్ స్క్రిప్ట్‌లలో --once ఫ్లాగ్‌ను వెతికి, అంతరాయం కలిగించగల (interruptible) జాబ్స్ ఉపయోగించే చోట దానిని daemon modeతో భర్తీ చేయండి.
  2. అత్యధిక సమయం తీసుకునే జాబ్స్‌ను (వేల సంఖ్యలో రోస్‌ను ప్రాసెస్ చేసేవి లేదా కొన్ని నిమిషాల పాటు నడిచేవి) గుర్తించి, వాటికి Interruptible contractను జోడించండి.
  3. ప్రతి లూప్ ఇటరేషన్ లోపల ఒక ఫ్లాగ్ చెక్‌ను చేర్చండి మరియు అవసరమైన ఫైనలైజేషన్ కోడ్‌ను interrupted() మెథడ్‌లోకి మార్చండి.
  4. డిప్లాయ్‌మెంట్‌లు ప్రాసెసింగ్‌పై ఎంత తరచుగా ప్రభావం చూపుతున్నాయో తెలుసుకోవడానికి మెట్రిక్స్‌ను సేకరించేలా WorkerInterrupted మరియు JobInterruptedలకు లిజనర్లను అనుసంధానించండి.
  5. Redis లేదా డేటాబేస్ క్యూల కోసం, బ్యాక్‌లాగ్‌ను పర్యవేక్షించడానికి totalSize()ని ఉపయోగించండి; SQS కోసం, CloudWatch అలారమ్‌లను సిద్ధంగా ఉంచుకోండి.

డిప్లాయ్‌మెంట్ వల్ల కలిగే షట్‌డౌన్‌లను అకస్మాత్తుగా ఆపివేయడంలా కాకుండా, ఒక సమన్వయంతో కూడిన ప్రక్రియగా పరిగణించండి. Laravel 13.31 డేటాను స్థిరంగా ఉంచుతుంది మరియు అసంపూర్తిగా ఉన్న జాబ్స్ వల్ల కలిగే ఆపరేషనల్ ఇబ్బందులను తగ్గిస్తుంది. దీనివల్ల కోడ్ బాధ్యత స్వల్పంగా పెరుగుతుంది, కానీ భారీ బ్యాక్‌గ్రౌండ్ ప్రాసెసింగ్‌పై ఆధారపడే టీమ్‌లకు ఇది మరింత నమ్మదగిన ప్రొడక్షన్ ఎన్విరాన్మెంట్‌ను అందిస్తుంది.