سافٹ ویئر میں لچک سے مراد کسی ایپلیکیشن کی غیر متوقع مسائل یا ناکامیوں کے باوجود آسانی سے اور قابل اعتماد طریقے سے کام جاری رکھنے کی صلاحیت ہے۔ فنٹیک پروجیکٹس میں لچک کو کئی وجوہات کی بنا پر خاص طور پر زیادہ اہمیت حاصل ہے۔ سب سے پہلے، کمپنیاں ریگولیٹری ضروریات کو پورا کرنے کی پابند ہیں اور مالیاتی ریگولیٹرز نظام کے اندر استحکام کو برقرار رکھنے کے لیے آپریشنل لچک پر زور دیتے ہیں۔ مزید برآں، ڈیجیٹل ٹولز کا پھیلاؤ اور تھرڈ پارٹی سروس پرووائیڈرز پر انحصار Fintech کے کاروبار کو سیکورٹی کے بڑھتے ہوئے خطرات سے دوچار کرتا ہے۔ لچک مختلف عوامل جیسے سائبر خطرات، وبائی امراض، یا جغرافیائی سیاسی واقعات، بنیادی کاروباری کارروائیوں اور اہم اثاثوں کی حفاظت کی وجہ سے بندش کے خطرات کو کم کرنے میں بھی مدد کرتی ہے۔
لچک کے نمونوں کے ذریعے، ہم اس بات کو یقینی بنانے کے لیے ڈیزائن کیے گئے بہترین طریقوں اور حکمت عملیوں کے ایک سیٹ کو سمجھتے ہیں کہ سافٹ ویئر رکاوٹوں کو برداشت کر سکتا ہے اور اپنے کام کو برقرار رکھ سکتا ہے۔ یہ پیٹرن حفاظتی جالوں کی طرح کام کرتے ہیں، غلطیوں کو سنبھالنے، بوجھ کو سنبھالنے، اور ناکامیوں سے بازیافت کرنے کا طریقہ کار فراہم کرتے ہیں، اس طرح یہ یقینی بناتے ہیں کہ ایپلی کیشنز منفی حالات میں مضبوط اور قابل اعتماد رہیں۔
سب سے عام لچکدار حکمت عملیوں میں بلک ہیڈ، کیش، فال بیک، دوبارہ کوشش، اور سرکٹ بریکر شامل ہیں۔ اس مضمون میں، میں ان پر مزید تفصیل سے بات کروں گا، ان مسائل کی مثالوں کے ساتھ جو وہ حل کرنے میں مدد کر سکتے ہیں۔
آئیے اوپر کی ترتیب پر ایک نظر ڈالیں۔ ہمارے پاس ایک بہت ہی عام ایپلی کیشن ہے جس سے کچھ ڈیٹا حاصل کرنے کے لیے ہمارے پیچھے کئی بیک اینڈ ہیں۔ ان بیک اینڈز سے کئی HTTP کلائنٹس جڑے ہوئے ہیں۔ یہ پتہ چلتا ہے کہ یہ سب ایک ہی کنکشن پول کا اشتراک کرتے ہیں! اور دیگر وسائل جیسے CPU اور RAM۔
کیا ہوگا، اگر بیک اینڈ میں سے کسی کو کسی قسم کی پریشانی کا سامنا کرنا پڑتا ہے جس کے نتیجے میں درخواست میں تاخیر ہوتی ہے؟ زیادہ رسپانس ٹائم کی وجہ سے، پورا کنکشن پول مکمل طور پر بیک اینڈ 1 سے جوابات کے منتظر درخواستوں سے بھر جائے گا۔ نتیجے کے طور پر، صحت مند backend2 اور backend3 کے لیے مطلوبہ درخواستیں آگے نہیں بڑھ سکیں گی کیونکہ پول ختم ہو گیا ہے۔ اس کا مطلب ہے کہ ہمارے بیک اینڈ میں سے کسی ایک میں ناکامی پوری ایپلی کیشن میں ناکامی کا سبب بن سکتی ہے۔ مثالی طور پر، ہم چاہتے ہیں کہ ناکام ہونے والے بیک اینڈ سے منسلک فعالیت ہی تنزلی کا تجربہ کرے، جبکہ باقی ایپلیکیشن معمول کے مطابق چلتی رہے۔
بلک ہیڈ پیٹرن کیا ہے؟
اصطلاح، بلک ہیڈ پیٹرن، جہاز سازی سے ماخوذ ہے، اس میں جہاز کے اندر کئی الگ تھلگ کمپارٹمنٹس بنانا شامل ہے۔ اگر ایک کمپارٹمنٹ میں رساو ہوتا ہے، تو یہ پانی سے بھر جاتا ہے، لیکن دوسرے کمپارٹمنٹ غیر متاثر ہوتے ہیں۔ یہ تنہائی ایک ہی خلاف ورزی کی وجہ سے پورے برتن کو ڈوبنے سے روکتی ہے۔
بلک ہیڈ پیٹرن کو کسی ایپلی کیشن کے اندر مختلف قسم کے وسائل کو الگ کرنے کے لیے استعمال کیا جا سکتا ہے، جس سے ایک حصے میں ناکامی کو پورے سسٹم کو متاثر کرنے سے روکا جا سکتا ہے۔ یہاں یہ ہے کہ ہم اسے اپنے مسئلے پر کیسے لاگو کرسکتے ہیں:
فرض کریں کہ ہمارے بیک اینڈ سسٹمز میں انفرادی طور پر غلطیوں کا سامنا کرنے کا امکان کم ہے۔ تاہم، جب کسی آپریشن میں ان تمام بیک اینڈز کو متوازی طور پر استفسار کرنا شامل ہوتا ہے، تو ہر ایک آزادانہ طور پر ایک غلطی واپس کر سکتا ہے۔ چونکہ یہ غلطیاں آزادانہ طور پر ہوتی ہیں، اس لیے ہماری درخواست میں غلطی کا مجموعی امکان کسی ایک بیک اینڈ کی غلطی کے امکان سے زیادہ ہے۔ مجموعی غلطی کا امکان P_total=1−(1−p)^n فارمولہ استعمال کرتے ہوئے لگایا جا سکتا ہے، جہاں n بیک اینڈ سسٹمز کی تعداد ہے۔
مثال کے طور پر، اگر ہمارے پاس دس بیک اینڈز ہیں، ہر ایک میں غلطی کا امکان p=0.001 (99.9% کے SLA کے مساوی ہے)، نتیجے میں خرابی کا امکان یہ ہے:
P_total=1−(1−0.001)^10=0.009955
اس کا مطلب ہے کہ ہمارا مشترکہ SLA تقریباً 99% تک گر جاتا ہے، یہ واضح کرتا ہے کہ متوازی طور پر متعدد بیک اینڈز سے استفسار کرنے پر مجموعی اعتبار کیسے کم ہوتا ہے۔ اس مسئلے کو کم کرنے کے لیے، ہم ان میموری کیش کو نافذ کر سکتے ہیں۔
ان میموری کیش ایک تیز رفتار ڈیٹا بفر کے طور پر کام کرتا ہے، جو اکثر رسائی شدہ ڈیٹا کو اسٹور کرتا ہے اور اسے ہر بار ممکنہ طور پر سست ذرائع سے لانے کی ضرورت کو ختم کرتا ہے۔ چونکہ میموری میں ذخیرہ شدہ کیشز میں نیٹ ورک پر ڈیٹا حاصل کرنے کے مقابلے میں غلطی کا 0% امکان ہوتا ہے، اس لیے وہ ہماری ایپلیکیشن کی بھروسے میں نمایاں اضافہ کرتے ہیں۔ مزید برآں، کیشنگ نیٹ ورک ٹریفک کو کم کرتی ہے، اور غلطیوں کے امکانات کو مزید کم کرتی ہے۔ نتیجتاً، ان میموری کیش کو استعمال کرکے، ہم اپنے بیک اینڈ سسٹمز کے مقابلے میں اپنی ایپلیکیشن میں خرابی کی شرح اور بھی کم حاصل کرسکتے ہیں۔ مزید برآں، ان میموری کیچز نیٹ ورک پر مبنی بازیافت کے مقابلے تیز رفتار ڈیٹا کی بازیافت پیش کرتے ہیں، اس طرح ایپلی کیشن میں تاخیر کو کم کیا جاتا ہے- ایک قابل ذکر فائدہ۔
پرسنلائزڈ ڈیٹا کے لیے، جیسے صارف کے پروفائلز یا سفارشات، ان میموری کیشز کا استعمال بھی انتہائی موثر ہو سکتا ہے۔ لیکن ہمیں اس بات کو یقینی بنانے کی ضرورت ہے کہ صارف کی تمام درخواستیں مستقل طور پر اسی ایپلیکیشن مثال پر جائیں تاکہ ان کے لیے کیش کردہ ڈیٹا کو استعمال کیا جا سکے، جس کے لیے سٹکی سیشنز کی ضرورت ہوتی ہے۔ چپچپا سیشنز کو نافذ کرنا مشکل ہو سکتا ہے، لیکن اس منظر نامے کے لیے ہمیں پیچیدہ میکانزم کی ضرورت نہیں ہے۔ معمولی ٹریفک ری بیلنسنگ قابل قبول ہے، لہذا ایک مستحکم لوڈ بیلنسنگ الگورتھم جیسا کہ مسلسل ہیشنگ کافی ہوگی۔
مزید یہ کہ، نوڈ کی ناکامی کی صورت میں، مسلسل ہیشنگ اس بات کو یقینی بناتی ہے کہ صرف ناکام نوڈ سے وابستہ صارفین ہی دوبارہ توازن سے گزریں، جس سے سسٹم میں خلل کو کم کیا جائے۔ یہ نقطہ نظر ذاتی کیش کے انتظام کو آسان بناتا ہے اور ہماری درخواست کے مجموعی استحکام اور کارکردگی کو بڑھاتا ہے۔
اگر ہم جس ڈیٹا کو کیش کرنے کا ارادہ رکھتے ہیں وہ اہم ہے اور ہر درخواست میں استعمال کیا جاتا ہے جو ہمارا سسٹم ہینڈل کرتا ہے، جیسے کہ رسائی کی پالیسیاں، سبسکرپشن پلانز، یا ہمارے ڈومین میں دیگر اہم اداروں — اس ڈیٹا کا ماخذ ہمارے سسٹم میں ناکامی کا ایک اہم نقطہ پیش کر سکتا ہے۔ اس چیلنج سے نمٹنے کے لیے، ایک طریقہ یہ ہے کہ اس ڈیٹا کو براہ راست ہماری ایپلی کیشن کی میموری میں مکمل طور پر نقل کیا جائے۔
اس منظر نامے میں، اگر ماخذ میں ڈیٹا کا حجم قابل انتظام ہے، تو ہم اپنی درخواست کے آغاز میں اس ڈیٹا کا سنیپ شاٹ ڈاؤن لوڈ کر کے عمل کو شروع کر سکتے ہیں۔ اس کے بعد، ہم اس بات کو یقینی بنانے کے لیے اپ ڈیٹس کے واقعات حاصل کر سکتے ہیں کہ کیش شدہ ڈیٹا ماخذ کے ساتھ مطابقت پذیر رہے۔ اس طریقہ کو اپنانے سے، ہم اس اہم ڈیٹا تک رسائی کی قابل اعتمادی کو بڑھاتے ہیں، کیونکہ ہر بازیافت 0% غلطی کے امکان کے ساتھ براہ راست میموری سے ہوتی ہے۔ مزید برآں، میموری سے ڈیٹا کی بازیافت غیر معمولی طور پر تیز ہے، اس طرح ہماری ایپلی کیشن کی کارکردگی کو بہتر بناتا ہے۔ یہ حکمت عملی بیرونی ڈیٹا سورس پر انحصار کرنے سے وابستہ خطرے کو مؤثر طریقے سے کم کرتی ہے، ہماری درخواست کے آپریشن کے لیے اہم معلومات تک مستقل اور قابل اعتماد رسائی کو یقینی بناتی ہے۔
تاہم، ایپلیکیشن اسٹارٹ اپ پر ڈیٹا ڈاؤن لوڈ کرنے کی ضرورت، اس طرح اسٹارٹ اپ کے عمل میں تاخیر، '12 فیکٹر ایپلی کیشن' کے اصولوں میں سے ایک کی خلاف ورزی ہے جو کہ فوری ایپلیکیشن اسٹارٹ اپ کی وکالت کرتی ہے۔ لیکن، ہم کیشنگ کے استعمال کے فوائد کو ضائع نہیں کرنا چاہتے۔ اس مخمصے کو حل کرنے کے لیے، آئیے ممکنہ حل تلاش کریں۔
تیز آغاز بہت ضروری ہے، خاص طور پر کبرنیٹس جیسے پلیٹ فارمز کے لیے، جو مختلف فزیکل نوڈس پر فوری ایپلیکیشن کی منتقلی پر انحصار کرتے ہیں۔ خوش قسمتی سے، Kubernetes سٹارٹ اپ پروبس جیسی خصوصیات کا استعمال کرتے ہوئے سست شروع ہونے والی ایپلیکیشنز کا نظم کر سکتا ہے۔
ایک اور چیلنج جس کا ہمیں سامنا ہو سکتا ہے وہ ہے اپلیکیشن کے چلنے کے دوران کنفیگریشنز کو اپ ڈیٹ کرنا۔ اکثر، پیداوار کے مسائل کو حل کرنے کے لیے کیشے کے اوقات کو ایڈجسٹ کرنا یا ٹائم آؤٹ کی درخواست کرنا ضروری ہوتا ہے۔ یہاں تک کہ اگر ہم اپنی ایپلیکیشن میں اپ ڈیٹ کردہ کنفیگریشن فائلوں کو تیزی سے تعینات کر سکتے ہیں، ان تبدیلیوں کو لاگو کرنے کے لیے عام طور پر دوبارہ شروع کرنے کی ضرورت ہوتی ہے۔ ہر ایپلیکیشن کے توسیعی آغاز کے وقت کے ساتھ، ایک رولنگ دوبارہ شروع کرنے سے ہمارے صارفین کے لیے اصلاحات کی تعیناتی میں کافی تاخیر ہو سکتی ہے۔
اس سے نمٹنے کے لیے، ایک حل یہ ہے کہ کنفیگریشن کو کنکرنٹ متغیر میں اسٹور کیا جائے اور بیک گراؤنڈ تھریڈ کو وقتاً فوقتاً اپ ڈیٹ کیا جائے۔ تاہم، بعض پیرامیٹرز، جیسے کہ HTTP درخواست کے ٹائم آؤٹ، کو HTTP یا ڈیٹا بیس کلائنٹس کو دوبارہ شروع کرنے کی ضرورت پڑسکتی ہے جب متعلقہ کنفیگریشن تبدیل ہوتی ہے، جو ایک ممکنہ چیلنج پیش کرتی ہے۔ پھر بھی، کچھ کلائنٹس، جیسے جاوا کے لیے کیسینڈرا ڈرائیور، اس عمل کو آسان بناتے ہوئے، کنفیگریشنز کو خودکار طور پر دوبارہ لوڈ کرنے کی حمایت کرتے ہیں۔
دوبارہ لوڈ کرنے کے قابل کنفیگریشنز کو لاگو کرنے سے ایپلیکیشن شروع ہونے کے طویل وقت کے منفی اثرات کو کم کیا جا سکتا ہے اور اضافی فوائد کی پیشکش کی جا سکتی ہے، جیسے فیچر فلیگ کے نفاذ میں سہولت فراہم کرنا۔ یہ نقطہ نظر ہمیں کنفیگریشن اپ ڈیٹس کا مؤثر طریقے سے انتظام کرتے ہوئے ایپلیکیشن کی وشوسنییتا اور ردعمل کو برقرار رکھنے کے قابل بناتا ہے۔
اب آئیے ایک اور مسئلہ پر ایک نظر ڈالتے ہیں: ہمارے سسٹم میں، جب صارف کی درخواست موصول ہوتی ہے اور بیک اینڈ یا ڈیٹا بیس کو سوال بھیج کر اس پر کارروائی کی جاتی ہے، تو کبھی کبھار، متوقع ڈیٹا کی بجائے غلطی کا جواب موصول ہوتا ہے۔ اس کے بعد، ہمارا سسٹم صارف کو 'خرابی' کے ساتھ جواب دیتا ہے۔
تاہم، بہت سے منظرناموں میں، صارف کو سرخ غلطی کے بڑے پیغام کے ساتھ چھوڑنے کے بجائے، ڈیٹا ریفریش میں تاخیر ہونے کی نشاندہی کرنے والے پیغام کے ساتھ تھوڑا سا پرانا ڈیٹا ڈسپلے کرنا زیادہ بہتر ہوگا۔
اس مسئلے کو حل کرنے اور اپنے سسٹم کے رویے کو بہتر بنانے کے لیے، ہم فال بیک پیٹرن کو نافذ کر سکتے ہیں۔ اس پیٹرن کے پیچھے تصور میں ثانوی ڈیٹا سورس کا ہونا شامل ہے، جس میں بنیادی ماخذ کے مقابلے میں کم معیار یا تازگی کا ڈیٹا ہو سکتا ہے۔ اگر بنیادی ڈیٹا ماخذ دستیاب نہیں ہے یا کوئی خرابی لوٹاتا ہے، تو سسٹم اس ثانوی ماخذ سے ڈیٹا کی بازیافت پر واپس آ سکتا ہے، اس بات کو یقینی بناتے ہوئے کہ صارف کو غلطی کا پیغام دکھانے کے بجائے کچھ معلومات کی شکل دی جائے۔
اگر آپ اوپر دی گئی تصویر کو دیکھیں گے، تو آپ کو اس مسئلے کے درمیان ایک مماثلت نظر آئے گی جس کا ہم ابھی سامنا کر رہے ہیں اور جس کا سامنا ہم نے کیش مثال کے ساتھ کیا ہے۔
اسے حل کرنے کے لیے، ہم ایک پیٹرن کو نافذ کرنے پر غور کر سکتے ہیں جسے دوبارہ کوشش کے نام سے جانا جاتا ہے۔ کیشز پر انحصار کرنے کے بجائے، سسٹم کو ایسا ڈیزائن کیا جا سکتا ہے کہ غلطی کی صورت میں خود بخود درخواست دوبارہ بھیج دی جائے۔ یہ دوبارہ کوشش کرنے کا پیٹرن ایک آسان متبادل پیش کرتا ہے اور مؤثر طریقے سے ہماری درخواست میں غلطیوں کے امکان کو کم کر سکتا ہے۔ کیشنگ کے برعکس، جس میں ڈیٹا کی تبدیلیوں کو سنبھالنے کے لیے اکثر پیچیدہ کیش کو غلط طریقہ کار کی ضرورت ہوتی ہے، ناکام درخواستوں کی دوبارہ کوشش کرنا نسبتاً سیدھا ہے۔ چونکہ کیشے کی غلط کاری کو سافٹ ویئر انجینئرنگ میں سب سے زیادہ چیلنجنگ کاموں میں سے ایک سمجھا جاتا ہے، اس لیے دوبارہ کوشش کرنے کی حکمت عملی اپنانے سے غلطی سے نمٹنے اور نظام کی لچک کو بہتر بنایا جا سکتا ہے۔
تاہم، ممکنہ نتائج پر غور کیے بغیر دوبارہ کوشش کی حکمت عملی اپنانا مزید پیچیدگیوں کا باعث بن سکتا ہے۔
آئیے تصور کریں کہ ہمارے بیک اینڈ میں سے ایک ناکامی کا تجربہ کرتا ہے۔ ایسے حالات میں، ناکام ہونے والے بیک اینڈ پر دوبارہ کوششیں شروع کرنے کے نتیجے میں ٹریفک کے حجم میں نمایاں اضافہ ہو سکتا ہے۔ ٹریفک میں یہ اچانک اضافہ بیک اینڈ پر حاوی ہو سکتا ہے، ناکامی کو بڑھا سکتا ہے اور ممکنہ طور پر پورے سسٹم میں جھڑپ کا اثر ڈال سکتا ہے۔
اس چیلنج سے نمٹنے کے لیے، سرکٹ بریکر پیٹرن کے ساتھ دوبارہ کوشش کرنے کے پیٹرن کو مکمل کرنا ضروری ہے۔ سرکٹ بریکر ایک حفاظتی طریقہ کار کے طور پر کام کرتا ہے جو نیچے کی دھارے کی خدمات کی خرابی کی شرح کو مانیٹر کرتا ہے۔ جب غلطی کی شرح پہلے سے طے شدہ حد سے تجاوز کر جاتی ہے، تو سرکٹ بریکر متاثرہ سروس کی درخواستوں کو ایک مخصوص مدت کے لیے روکتا ہے۔ اس مدت کے دوران، سسٹم ناکام سروس کے وقت کو بحال کرنے کے لیے اضافی درخواستیں بھیجنے سے گریز کرتا ہے۔ مقررہ وقفہ کے بعد، سرکٹ بریکر احتیاط سے درخواستوں کی ایک محدود تعداد کو گزرنے کی اجازت دیتا ہے، اس بات کی تصدیق کرتا ہے کہ آیا سروس مستحکم ہو گئی ہے۔ اگر سروس بحال ہو گئی ہے، عام ٹریفک بتدریج بحال ہو جائے گی۔ بصورت دیگر، سرکٹ کھلا رہتا ہے، درخواستوں کو بلاک کرتا رہتا ہے جب تک کہ سروس معمول کے مطابق کام شروع نہیں کر دیتی۔ دوبارہ کوشش کرنے کی منطق کے ساتھ سرکٹ بریکر پیٹرن کو مربوط کرکے، ہم خرابی کے حالات کو مؤثر طریقے سے منظم کر سکتے ہیں اور بیک اینڈ کی ناکامیوں کے دوران سسٹم کے اوورلوڈ کو روک سکتے ہیں۔
آخر میں، لچک کے ان نمونوں کو لاگو کر کے، ہم ہنگامی حالات کے خلاف اپنی ایپلی کیشنز کو مضبوط بنا سکتے ہیں، اعلیٰ دستیابی کو برقرار رکھ سکتے ہیں، اور صارفین کو ایک ہموار تجربہ فراہم کر سکتے ہیں۔ مزید برآں، میں اس بات پر زور دینا چاہوں گا کہ ٹیلی میٹری ایک اور ٹول ہے جسے پروجیکٹ کی لچک فراہم کرتے وقت نظر انداز نہیں کیا جانا چاہیے۔ اچھے لاگ اور میٹرکس خدمات کے معیار کو نمایاں طور پر بڑھا سکتے ہیں اور ان کی کارکردگی کے بارے میں قیمتی بصیرت فراہم کر سکتے ہیں، انہیں مزید بہتر بنانے کے لیے باخبر فیصلے کرنے میں مدد کرتے ہیں۔