𝗦𝘁𝗼𝗽 𝗡+𝟭 𝗔𝘃𝗮𝗹𝗮𝗻𝗰𝗵𝗲𝘀: 𝗘𝗻𝗳𝗼𝗿𝗰𝗲 𝗟𝗮𝗿𝗮𝘃𝗲𝗹 𝗦𝘁𝗿𝗶𝗰𝘁 𝗠𝗼𝗱𝗲
N+1 کوئری کا مسئلہ ڈیٹا بیس کی کارکردگی کو تباہ کر دیتا ہے۔ یہ اس وقت ہوتا ہے جب آپ ریکارڈز کی ایک فہرست حاصل کرتے ہیں اور کسی ریلیشن شپ (relationship) تک رسائی کے لیے ان پر لوپ (loop) چلاتے ہیں۔ آپ اس ریلیشن شپ کو پہلے سے لوڈ کرنا بھول گئے ہوتے ہیں۔
فرض کریں کہ آپ ڈیش بورڈ پر 50 انوائسز (invoices) دکھاتے ہیں۔ کلائنٹ کا نام دکھانے کے لیے آپ ان پر لوپ چلاتے ہیں۔ آپ with میتھڈ کا استعمال کرنا بھول گئے ہیں۔ Eloquent انوائسز کے لیے 1 کوئری چلاتا ہے، اور پھر ہر کلائنٹ کے لیے 50 الگ الگ کوئریز چلاتا ہے۔
لوکل ڈویلپمنٹ (local development) میں، 51 کوئریز صرف 10 ملی سیکنڈ لیتی ہیں۔ آپ کو اس کا احساس بھی نہیں ہوگا۔ لیکن پروڈکشن (production) میں، بھاری ٹریفک اسے ایک سیلاب میں بدل دیتی ہے۔ یہ آپ کے ڈیٹا بیس کنکشن پول (connection pool) کو ختم کر دیتا ہے اور آپ کے سرور کو کریش کر دیتا ہے۔
آپ صرف کوڈ ریویوز (code reviews) پر بھروسہ نہیں کر سکتے۔ آپ کو ایک آرکیٹیکچرل گارڈ ریل (architectural guardrail) کی ضرورت ہے۔
Laravel اس مسئلے کو حل کرنے کے لیے Strict Mode فراہم کرتا ہے۔ آپ ایپلی کیشن لیول پر preventLazyLoading کا استعمال کر سکتے ہیں۔ Laravel آپ کے ڈیٹا بیس ریلیشن شپ کی نگرانی کرے گا۔ اگر یہ لوکل ڈویلپمنٹ یا ٹیسٹنگ کے دوران 'lazy load' کا پتہ لگاتا ہے، تو یہ ایک exception تھرو (throw) کر دے گا۔ یہ آپ کو فوری طور پر کوڈ ٹھیک کرنے پر مجبور کرتا ہے۔
اسے کیسے سیٹ اپ کریں:
اپنے AppServiceProvider میں حفاظتی میکانزم (safety mechanism) کو کنفیگر کریں۔ یہ لوکل اور ٹیسٹنگ ماحول کے لیے کریں۔ پروڈکشن میں، آپ کو ایپ کو کریش کرنے کے بجائے ایرر (error) کو لاگ (log) کرنا چاہیے۔
اپنے boot میتھڈ میں یہ تین سیٹنگز استعمال کریں:
Model::preventLazyLoading: N+1 کوئریز کو روکتا ہے۔Model::preventSilentlyDiscardingAttributes: Mass assignment کی ناکامیوں کو روکتا ہے۔Model::preventAccessingMissingAttributes: گمشدہ ریلیشن شپ کی وجہ سے ہونے والے میموری لیکس (memory leaks) کو روکتا ہے۔
پروڈکشن کے لیے، handleLazyLoadingViolationUsing کا استعمال کریں۔ یہ آپ کو خلاف ورزیوں (violations) کو Slack یا کسی لاگنگ سروس میں لاگ کرنے کی اجازت دیتا ہے۔ اس طرح آپ صارف کے تجربے (user experience) کو خراب کیے بغیر مکمل معلومات حاصل کر سکتے ہیں۔
Strict Mode کو نافذ کرنے سے آپ کے پائپ لائن (pipeline) کے آغاز میں ہی آپٹیمائزیشن (optimization) ہو جاتی ہے۔ N+1 کوئریز آپ کے ٹیسٹ پاس نہیں کر پائیں گی۔ آپ کا کوڈ بیس آپٹیمائزڈ رہے گا اور آپ کا ڈیٹا بیس تیز رہے گا۔
Source: https://dev.to/iprajapatiparesh/stop-n1-avalanches-enforce-laravel-strict-mode-2oop