Laravel 13.31 میں interruptible jobs کا اضافہ کیا گیا ہے، جو کیو ورکرز (queue workers) کو ڈیپلائمنٹس کے دوران بھیجے جانے والے SIGTERM سگنل کو پکڑنے اور کسی کام کو ادھورا چھوڑنے کے بجائے صفائی سے بند ہونے کی اجازت دیتا ہے۔ وہ ٹیمیں جو طویل جابز چلاتی ہیں—جیسے کہ دسیوں ہزار روز (rows) پر کارروائی کرنا، بلک ای میلز بھیجنا، یا رپورٹس تیار کرنا—انہیں اس سے فائدہ ہوگا کیونکہ نیا ریلیز آنے پر ڈیٹا مستقل (consistent) رہتا ہے۔

ڈیپلائمنٹس کیوں جابز کو ختم کر رہے تھے

جب نیا ورژن آتا ہے، تو Supervisor، Docker، اور Kubernetes جیسے پروسیس مینیجرز موجودہ ورکرز کو ختم کرنے کی ایک شائستہ درخواست، یعنی SIGTERM بھیج کر انہیں رکنے کا کہتے ہیں۔ زیادہ تر ورکرز باہر نکلنے سے پہلے موجودہ جاب کے مکمل ہونے کا انتظار کرتے ہیں۔ مسئلہ تب پیدا ہوتا ہے جب مینیجر اس عمل کی تعمیل کے لیے صرف چند سیکنڈز دیتا ہے۔ اگر کسی جاب کو منٹوں کی ضرورت ہو، تو مینیجر SIGKILL پر منتقل ہو جاتا ہے، جو پروسیس کو فوری طور پر ختم کر دیتا ہے۔ اس صورت میں جاب کبھی بھی ایک مستقل حالت (consistent state) تک نہیں پہنچ پاتی، جس کے نتیجے میں جزوی طور پر اپ ڈیٹ شدہ ریکارڈز، یتیم فائلیں (orphaned files)، یا دوہرا کام باقی رہ جاتا ہے۔

Laravel کا جواب: تعاون پر مبنی انٹروپشن (cooperative interruption)

Laravel 13.31 ایک کنٹریکٹ متعارف کرواتا ہے جس کا نام Interruptible ہے، جسے ایک جاب کلاس ٹرمینیشن کی درخواست سے آگاہ ہونے کے لیے نافذ (implement) کر سکتی ہے۔ جب SIGTERM موصول ہوتا ہے، تو Laravel جاب کے interrupted() میتھڈ کو کال کرتا ہے۔ فریم ورک خود بخود جاب کو نہیں روکتا؛ جاب کو خود اس فلیگ (flag) کو چیک کرنا چاہیے جو Laravel سیٹ کرتا ہے اور پھر خود ہی باہر نکلنا چاہیے۔ یہ تعاون پر مبنی ماڈل ڈویلپرز کو موجودہ لوپ کی تکرار (iteration) مکمل کرنے، جزوی تبدیلیوں کو واپس (roll back) کرنے، یا بند ہونے سے پہلے ایک چیک پوائنٹ لکھنے کی اجازت دیتا ہے۔

کسی جاب کو interruptible کیسے بنائیں

  1. کنٹریکٹ کو نافذ کریں – جاب کلاس کی تعریف میں implements Interruptible شامل کریں۔
  2. ورک لوپ کے اندر فلیگ چیک کریں – ہر تکرار (iteration) میں یہ چیک کرنے کے لیے ایک چیک شامل کریں کہ آیا جاب کو رکنا چاہیے۔
  3. صفائی (cleanup) کریں – interrupted() میں، ایسی کوئی بھی حالت محفوظ کریں جو جاب کو بعد میں دوبارہ شروع کرنے کی اجازت دے، یا بعد میں تجزیہ کرنے کے لیے انٹروپشن کو لاگ (log) کریں۔

سب سے بڑا جال: --once استعمال نہ کریں

php artisan queue:work --once کے ساتھ کیو ورکر چلانے سے سگنل ہینڈلنگ مکمل طور پر غیر فعال ہو جاتی ہے۔ ورکر ایک ہی جاب پر کارروائی کرتا ہے اور باہر نکل جاتا ہے، لیکن یہ کبھی بھی SIGTERM ہینڈلر کو رجسٹر نہیں کرتا۔ نتیجے کے طور پر، کوئی بھی interruptible جاب ٹرمینیشن کی درخواست کو نظر انداز کر دیتی ہے اور عمل کے دوران ہی ختم کر دی جاتی ہے۔ یہ پیٹرن کرون (cron) پر مبنی کنٹینرز اور ون شاٹ ڈیپلائمنٹس

  1. ڈیپلائمنٹ اسکرپٹس میں --once فلیگ تلاش کریں اور اسے ڈیمن موڈ (daemon mode) سے بدل دیں جہاں قابلِ وقف (interruptible) جابز استعمال کی جاتی ہیں۔
  2. سب سے زیادہ وقت لینے والی جابز کی نشاندہی کریں (وہ جو دسیوں ہزار روز (rows) پر اثر انداز ہوتی ہیں یا کئی منٹ تک چلتی ہیں) اور ان میں Interruptible contract شامل کریں۔
  3. ہر لوپ کے دوران (loop iteration) ایک فلیگ چیک شامل کریں، اور کسی بھی ضروری فائنلائزیشن کوڈ کو interrupted() میتھڈ میں منتقل کر دیں۔
  4. WorkerInterrupted اور JobInterrupted کے ساتھ لسنرز (listeners) کو ہک کریں تاکہ اس بات کے میٹرکس (metrics) جمع کیے جا سکیں کہ ڈیپلائمنٹس کتنا اثر انداز ہوتے ہیں۔
  5. Redis یا ڈیٹا بیس کیوز (queues) کے لیے، بیک لاگ (backlog) کی نگرانی کرنے کے لیے totalSize() کا استعمال کریں؛ SQS کے لیے، CloudWatch الرامز کو برقرار رکھیں۔

ڈیپلائمنٹ کی وجہ سے ہونے والے شٹ ڈاؤنز کو اچانک بند کرنے (abrupt kill) کے بجائے ایک مربوط قدم کے طور پر سمجھیں۔ Laravel 13.31 ڈیٹا کو مستقل (consistent) رکھتا ہے اور ادھوری رہ جانے والی جابز کی آپریشنل مشکلات کو کم کرتا ہے۔ اس کا تبادلہ کوڈ کی ذمہ داری میں معمولی اضافہ ہے، لیکن وہ ٹیمیں جو بھاری بیک گراؤنڈ پروسیسنگ پر انحصار کرتی ہیں، انہیں ایک زیادہ قابلِ اعتماد پروڈکشن ماحول حاصل ہوتا ہے۔