Laravel 13.31 मध्ये interruptible jobs जोडले गेले आहेत, ज्यामुळे queue workers डिप्लॉयमेंट दरम्यान पाठवलेला SIGTERM सिग्नल पकडू शकतात आणि एखादे काम अर्धवट सोडण्याऐवजी व्यवस्थित (cleanly) बंद होऊ शकतात. जे टीम्स दीर्घकाळ चालणारे जॉब्स चालवतात—जसे की हजारो ओळींवर प्रक्रिया करणे, बल्क ईमेल्स पाठवणे किंवा रिपोर्ट्स तयार करणे—त्यांना याचा फायदा होईल कारण नवीन रिलीज रोल आउट होताना डेटा सुसंगत (consistent) राहतो.

डिप्लॉयमेंट्समुळे जॉब्स का मध्येच थांबत होते

जेव्हा नवीन व्हर्जन येते, तेव्हा Supervisor, Docker आणि Kubernetes सारखे प्रोसेस मॅनेजर्स SIGTERM पाठवून विद्यमान वर्कर्सना थांबण्यास सांगतात, जो थांबण्यासाठीचा एक नम्र विनंती असतो. बहुतेक वर्कर्स बाहेर पडण्यापूर्वी सध्याचा जॉब पूर्ण होण्याची वाट पाहतात. समस्या तेव्हा उद्भवते जेव्हा मॅनेजर केवळ काही सेकंदांचा वेळ देतो. जर एखाद्या जॉबला मिनिटे लागण्याची गरज असेल, तर मॅनेजर SIGKILL कडे वळतो, ज्यामुळे प्रोसेस त्वरित थांबवली जाते. यामुळे जॉब कधीही सुसंगत स्थितीत पोहोचत नाही, ज्यामुळे अर्धवट अपडेट केलेले रेकॉर्ड्स, विस्कळीत (orphaned) फाइल्स किंवा डुप्लिकेट काम राहू शकते.

Laravel चे उत्तर: को-ऑपरेटिव्ह इंटरप्शन (cooperative interruption)

Laravel 13.31 मध्ये Interruptible नावाचा एक कॉन्ट्रॅक्ट सादर केला आहे, जो एखादा जॉब क्लास टर्मिनेशन विनंती ओळखण्यासाठी लागू (implement) करू शकतो. जेव्हा SIGTERM येतो, तेव्हा Laravel जॉबच्या interrupted() मेथडला कॉल करते. फ्रेमवर्क जॉब आपोआप थांबवत नाही; जॉबला Laravel ने सेट केलेला फ्लॅग तपासावा लागतो आणि स्वतःहून बाहेर पडावे लागते. हे सहकारी मॉडेल (cooperative model) डेव्हलपर्सना सध्याचे लूप इटरेशन पूर्ण करण्यास, अर्धवट बदल रोल बॅक करण्यास किंवा बाहेर पडण्यापूर्वी चेकपॉइंट लिहिण्यास मदत करते.

जॉब interruptible कसा बनवायचा

  1. कॉन्ट्रॅक्ट लागू करा – जॉब क्लासच्या डेफिनेशनमध्ये implements Interruptible जोडा.
  2. वर्क लूपमध्ये फ्लॅग तपासा – जॉब थांबवायचा की नाही हे पाहण्यासाठी प्रत्येक इटरेशनमध्ये एक चेक समाविष्ट करा.
  3. क्लिनअप करा – interrupted() मध्ये, अशी कोणतीही स्थिती (state) जतन करा ज्यामुळे जॉब नंतर पुन्हा सुरू करता येईल, किंवा नंतरच्या विश्लेषणासाठी इंटरप्शन लॉग करा.

सर्वात मोठी चूक: --once वापरू नका

php artisan queue:work --once वापरून queue worker चालवल्यास सिग्नल हँडलिंग पूर्णपणे बंद होते. वर्कर एक सिंगल जॉब प्रोसेस करतो आणि बाहेर पडतो, परंतु तो कधीही SIGTERM हँडलर रजिस्टर करत नाही. परिणामी, कोणताही interruptible जॉब टर्मिनेशन विनंतीकडे दुर्लक्ष करतो आणि प्रक्रियेच्या मध्यभागीच मारला जातो. ही पद्धत क्रॉन-ड्रिव्हन कंटेनर्स आणि वन-शॉट डिप्लॉयमेंट्समध्ये दिसून येते. जेव्हा तुम्हाला interruptible jobs ची गरज असेल तेव्हा डेमन मोड (php artisan queue:work) चालवून हे दुरुस्त करा.

इंटरप्शनवर लक्ष ठेवणे

Laravel दोन इव्हेंट्स फायर करते ज्यामध्ये तुम्ही हुक (hook) करू शकता:

  • WorkerInterrupted – जेव्हा कोणताही वर्कर SIGTERM प्राप्त करतो तेव्हा हा इव्हेंट उत्सर्जित होतो. हा इव्हेंट लॉग केल्यामुळे डिप्लॉयमेंट्स किती वेळा वर्कर्सना मध्येच थांबवतात याचा उच्च-स्तरीय दृष्टिकोन मिळतो.
  • JobInterrupted – हा इव्हेंट फक्त तेव्हाच उत्सर्जित होतो जर सध्याचा जॉब Interruptible कॉन्ट्रॅक्ट लागू करत असेल. तात्पुरत्या फाइल्स हटवणे किंवा “last processed row” मार्कर अपडेट करणे यांसारख्या जॉब-विशिष्ट क्लिनअपसाठी या इव्हेंटचा वापर करा.

या इव्हेंट्सवर लक्ष ठेवल्यामुळे टीम्स असे डॅशबोर्ड तयार करू शकतात जे डिप्लॉयमेंटचा प्रभाव दर्शवतात आणि वारंवार मध्येच थांबणाऱ्या जॉब्सना ओळखण्यास मदत करतात.

क्यू साईज रिपोर्टिंगमध्ये सुधारणा

या रिलीजमध्ये queue मॅनेजरमध्ये totalSize() मेथड जोडली आहे, जी सर्व क्यू मधील प्रलंबित जॉब्सची एकूण संख्या परत करते. ही व्हॅल्यू डेटाबेस-बॅक्ड आणि Redis ड्रायव्हर्ससाठी विश्वसनीय आहे, जे प्रत्यक्ष संख्या रिपोर्ट करतात. SQS, Sync आणि Beanstalkd सारखे ड्रायव्हर्स अजूनही शून्य परत करतात कारण ते Laravel च्या API द्वारे संख्या दर्शवत नाहीत. SQS वापरणाऱ्या टीम्सनी क्यू डेप्थसाठी CloudWatch मेट्रिक्सवर अवलंबून राहणे सुरू ठेवावे.

वेगवेगळ्या सेटअपसाठी याचा अर्थ काय

  • Docker/Kubernetes – ग्रॅसफुल शटडाउन कालावधीचा आता प्रभावीपणे वापर केला जाऊ शकतो. टर्मिनेशन ग्रॅस पिरीयड वाढवा जेणेकरून जॉब्सना फ्लॅग लक्षात घेऊन व्यवस्थित बाहेर पडण्यासाठी काही सेकंद मिळतील.
  • Supervisor – इंटरप्शन फ्लॅग मिळाल्यानंतर जॉब पूर्ण होण्यासाठी तुम्हाला अपेक्षित असलेल्या वेळेपेक्षा stopwaitsecs जास्त ठेवा.
  • Legacy jobs – मॅनेजरच्या टाइमआउटपेक्षा जास्त वेळ चालणाऱ्या कोणत्याही जॉबचे पुनरावलोकन करा आणि शक्य असेल तिथे त्यांना interruptible बनवा.

प्रतिवाद: वाढलेली गुंतागुंत

हे फिचर योग्य टाइमआउट कॉन्फिगरेशनची जागा घेत नाही. जर जॉबच्या लूपने इंटरप्शन फ्लॅग कधीच तपासला नाही, तर मॅनेजर तरीही SIGKILL पाठवेल. टीम्सनी दीर्घकाळ चालणाऱ्या कोड पाथ्सचे ऑडिट केले पाहिजे आणि तार्किक ब्रेकपॉइंट्सवर चेक समाविष्ट केले पाहिजेत. काही डेव्हलपर्सना अतिरिक्त बॉयलरप्लेट (implementing a contract and adding flag checks) हे अशा लहान जॉब्ससाठी अवांछनीय वाटू शकते जे आधीच शटडाउन विंडोमध्ये पूर्ण होतात.

कृती चेकलिस्ट

  1. डिप्लॉयमेंट स्क्रिप्ट्समध्ये --once फ्लॅग तपासा आणि जिथे 'interruptible jobs' वापरले जातात तिथे तो 'daemon mode' ने बदला.
  2. सर्वात जास्त वेळ चालणारे जॉब्स ओळखा (जे हजारो रो (rows) हाताळतात किंवा अनेक मिनिटे चालतात) आणि त्यात 'Interruptible contract' जोडा.
  3. प्रत्येक लूप इटरेशनमध्ये (loop iteration) फ्लॅग चेक समाविष्ट करा आणि आवश्यक असलेला कोणताही फायनलायझेशन कोड interrupted() मेथडमध्ये हलवा.
  4. डिप्लॉयमेंटमुळे प्रोसेसिंगवर किती वेळा परिणाम होतो याची मेट्रिक्स (metrics) गोळा करण्यासाठी WorkerInterrupted आणि JobInterrupted ला लिसनर्स (listeners) जोडा.
  5. Redis किंवा डेटाबेस क्यूजसाठी (queues), बॅकलॉग (backlog) मॉनिटर करण्यासाठी totalSize() वापरा; SQS साठी, CloudWatch अलार्म्स सुरू ठेवा.

डिप्लॉयमेंटमुळे होणारे शटडाउन हे अचानक बंद करण्याऐवजी (abrupt kill) एक समन्वित प्रक्रिया (coordinated step) म्हणून हाताळा. Laravel 13.31 डेटा सुसंगत (consistent) ठेवते आणि अर्धवट राहिलेल्या जॉब्समुळे उद्भवणाऱ्या ऑपरेशनल अडचणी कमी करते. याचा एकमेव तोटा म्हणजे कोडची जबाबदारी थोडी वाढते, परंतु ज्या टीम्स मोठ्या प्रमाणात बॅकग्राउंड प्रोसेसिंगवर अवलंबून असतात, त्यांना अधिक विश्वसनीय प्रोडक्शन एन्व्हायरनमेंट (production environment) मिळते.