پلگ نکال دیں۔ کل سوئچ (killswitch) دبا دیں۔ یہ جبلتیں تب کام کرتی ہیں جب آپ ایک ہی مشین کے پاس کھڑے ہوں۔ جب آپ کا AI سسٹم تین ایویلیبلٹی زونز (availability zones) میں پھیلے ہوئے پچاس نوڈز پر مشتمل ہو، تو یہ ناکام ہو جاتی ہیں۔ زیادہ تر انجینئرنگ ٹیمیں یہ سبق مشکل طریقے سے سیکھتی ہیں۔ وہ ایک مرکزی ڈیٹا بیس کو اپ ڈیٹ کرتے ہیں، ایک بولین (boolean) ویلیو کو 'true' سے 'false' پر تبدیل کرتے ہیں، اور یہ فرض کر لیتے ہیں کہ سسٹم رک جائے گا۔ ایسا نہیں ہوتا۔ ڈیٹا بیس تو صاف نظر آتا ہے، لیکن سروس اب بھی چل رہی ہوتی ہے۔
واحد سوئچ کا وہم
ایک ایسے کنٹرولر کا تصور کریں جو epoch 12 پر ایک منسوخی (revocation) ریکارڈ کرتا ہے۔ یہ تبدیلی کو ایک مستقل اسٹور (persistent store) میں لکھتا ہے اور سکون کا سانس لیتا ہے۔ اس دوران، Worker B epoch 11 کی ایک کیش شدہ اجازت (cached grant) پر کام کر رہا ہے۔ ورکر کو یہ اطلاع ہی نہیں ملی۔ تیس سیکنڈ بعد، وہ ایک ماڈل انفرنس جاب (model inference job) شروع کرتا ہے، ایک GPU کلسٹر چلاتا ہے، یا کسی بیرونی API کو کال کرتا ہے۔ آڈٹ لاگ کہتا ہے کہ رسائی منسوخ کر دی گئی تھی، لیکن عمل پھر بھی ہو گیا۔
یہ مستقل مزاجی (persistence) اور پھیلاؤ (propagation) کے درمیان کا فرق ہے۔ ڈیٹا بیس میں لکھنا سسٹم کی حالت (state) نہیں ہے۔ یہ صرف ایک ٹیبل میں ایک رو (row) ہے، اور آپ کے سسٹم میں بہت سے عوامل (actors) اس وقت اس ٹیبل سے معلومات حاصل (poll) نہیں کرتے جب انہیں ضرورت ہوتی ہے۔ اگر آپ ایمرجنسی اسٹاپ کو لائٹ کے سوئچ کی طرح سمجھیں گے، تو آپ دیکھیں گے کہ کمرے کے کچھ کونوں میں کبھی اندھیرا نہیں چھاتا۔
ڈسٹریبیوٹڈ سسٹمز کی تلخ حقیقت
آپ کو ناکامی کے لیے ڈیزائن کرنا ہوگا۔ کبھی کبھار ہونے والی ناکامی کے لیے نہیں، بلکہ مسلسل، الجھی ہوئی اور آزادانہ ناکامیوں کے لیے۔ ورکرز کام کے دوران ری بوٹ ہو جاتے ہیں۔ کیو کنزیومرز (queue consumers) منٹوں پیچھے رہ جاتے ہیں۔ از授权 (authorization) سروسز پرانا ڈیٹا (stale data) فراہم کرتی ہیں کیونکہ ایک ریپلیکا پھنس چکا ہوتا ہے۔ پیغامات ڈپلیکیٹ ہو جاتے ہیں۔ پیغامات غائب ہو جاتے ہیں۔ پیغامات ترتیب کے بغیر پہنچتے ہیں۔ آپ کا NTP ڈیمن (daemon) ڈرفٹ ہو جاتا ہے، اور اچانک ایک نوڈ سمجھتا ہے کہ وہ دوسروں سے دس سیکنڈ پیچھے ہے۔ گھڑیوں میں غلطیاں ہوتی ہیں، اور آپ مختلف حدود کے درمیان واقعات کی ترتیب کے لیے 'وال ٹائم' (wall time) پر بھروسہ نہیں کر سکتے۔
اگر آپ کا ایمرجنسی پروٹوکول قابل اعتماد نیٹ ورکس، پیغامات کی ترتیب وار ترسیل، یا ہم آہنگ گھڑیوں کا فرض کرتا ہے، تو آپ کے پاس کوئی پروٹوکول نہیں ہے۔ آپ کے پاس صرف ایک خواہش ہے۔ ورکرز، کیو کنزیومرز، اور از授权 سروسز آزادانہ طور پر ناکام ہوتے ہیں۔ آپ کے حفاظتی اصولوں کو اس وقت بھی برقرار رہنا چاہیے جب انفراسٹرکچر عملی طور پر مخالف (hostile) محسوس ہو۔
پانچ اصول جو حقیقت میں کام کرتے ہیں
حفاظت ان اصولوں (invariants) سے آتی ہے جو افراتفری میں بھی قائم رہتے ہیں۔ یہاں وہ اصول ہیں جو منسوخی (revocation) کو محض ایک افسانہ بننے سے روکتے ہیں۔
کوئی بھی عمل اس 'گرینٹ ایپوک' (grant epoch) سے شروع نہیں ہونا چاہیے جو 'ریووکیشن ایپوک' (revocation epoch) سے کم ہو۔
یہ آپ کی بنیادی حفاظتی حد (guardrail) ہے۔ ہر اجازت (permission grant) کے ساتھ ایک ایپوک نمبر ہوتا ہے۔ ہر منسوخی (revocation) کے ساتھ ایک نیا نمبر ہوتا ہے۔ کسی بھی ورکر کے عمل کرنے سے پہلے، وہ ان نمبروں کا موازنہ کرتا ہے۔ اگر ورکر کی اجازت اس تازہ ترین منسوخی سے پرانی ہے جو اس نے دیکھی ہے، تو ورکر رک جاتا ہے۔ ایپوکس (Epochs) آپ کو ایک لاجیکل کلاک (logical clock) فراہم کرتے ہیں جو سسٹم کلاک پر منحصر نہیں ہوتا۔ epoch 11 رکھنے والا ورکر کام شروع کرنے سے انکار کر دینا چاہیے جیسے ہی اسے معلوم ہو کہ epoch 12 نے بنیادی اختیار کو منسوخ کر دیا ہے۔
کیش شدہ اجازتیں (Cached grants) ایک مقررہ وقت کی حد کے اندر ختم ہو جانی چاہئیں۔
اجازت کو کبھی بھی میموری میں ہمیشہ کے لیے نہیں رہنا چاہیے۔ ورکرز کو ایک مقررہ وقفے کے بعد اپنے حقوق کی دوبارہ تصدیق کرنے یا انہیں ختم کرنے کی ضرورت ہوتی ہے۔ اس کے بغیر، ایک نوڈ جو آف لائن ہو جاتا ہے، وہ دنوں یا ہفتوں بعد جاگ سکتا ہے اور ایک پرانی (fossilized) اجازت کا استعمال کرتے ہوئے کام کر سکتا ہے۔ ایک لیز (lease) مقرر کریں۔ اسے سختی سے نافذ کریں۔ وقت آپ کا خودکار صفائی کرنے والا عملہ بن جائے گا۔
سسٹم کا دوبارہ آغاز (restart) محفوظ شدہ ایپوک کو کم نہیں کر سکتا۔
مستقل مزاجی (Persistence) اہمیت رکھتی ہے۔ اگر ایک کنٹرولر کریش ہو جائے اور دوبارہ شروع ہو، تو اسے وہ سب سے زیادہ ایپوک بحال کرنا چاہیے جو اس نے کبھی جاری کیا تھا۔ پرانے ایپوک پر واپس جانا منسوخ شدہ اجازتوں کو دوبارہ زندہ کر دے گا جیسے کہ ایمرجنسی اسٹاپ کبھی ہوا ہی نہ تھا۔ ایپوک کو براڈکاسٹ کرنے سے پہلے اسے مستقل طور پر محفوظ کریں۔ رائٹ-ایڈ لاگ (write-ahead log)، کنفرمڈ fsync، یا ریپلیکیٹڈ کنسنسس گروپ (replicated consensus group) کا استعمال کریں۔ تاریخ صرف آگے بڑھتی ہے۔
ڈپلیکیٹ ریv
