N+1 సమస్యల ప్రభావాన్ని ఆపండి: Laravel Strict Modeని అమలు చేయండి
N+1 క్వెరీ సమస్య డేటాబేస్ పనితీరును దెబ్బతీస్తుంది. మీరు రికార్డుల జాబితాను పొందినప్పుడు మరియు వాటిలోని రిలేషన్షిప్లను యాక్సెస్ చేయడానికి లూప్ (loop) చేసినప్పుడు ఇది జరుగుతుంది. మీరు ఆ రిలేషన్షిప్ను ముందుగానే లోడ్ చేయడం మర్చిపోయినప్పుడు ఇది సంభవిస్తుంది.
ఉదాహరణకు, మీరు ఒక డ్యాష్బోర్డ్లో 50 ఇన్వాయిస్లను చూపిస్తున్నారనుకోండి. క్లయింట్ పేరును చూపించడానికి మీరు వాటిపై లూప్ చేస్తారు. మీరు with మెథడ్ను ఉపయోగించడం మర్చిపోయారు. Eloquent ఇన్వాయిస్ల కోసం 1 క్వెరీని రన్ చేస్తుంది. ఆ తర్వాత ప్రతి క్లయింట్ కోసం విడివిడిగా 50 క్వెరీలను రన్ చేస్తుంది.
లోకల్ డెవలప్మెంట్లో, 51 క్వెరీలకు కేవలం 10 మిల్లీసెకన్లు పడుతుంది. మీరు దానిని గమనించలేరు. కానీ ప్రొడక్షన్లో, భారీ ట్రాఫిక్ వల్ల ఇది ఒక పెద్ద సమస్యగా మారుతుంది. ఇది మీ డేటాబేస్ కనెక్షన్ పూల్ను ఖాళీ చేసి, మీ సర్వర్ను క్రాష్ చేస్తుంది.
మీరు కేవలం కోడ్ రివ్యూలపై మాత్రమే ఆధారపడలేరు. మీకు ఒక ఆర్కిటెక్చరల్ గార్డ్రైల్ (architectural guardrail) అవసరం.
దీనిని పరిష్కరించడానికి Laravel Strict Modeని అందిస్తుంది. మీరు అప్లికేషన్ స్థాయిలో preventLazyLoadingని ఉపయోగించవచ్చు. Laravel మీ డేటాబేస్ రిలేషన్షిప్లను పర్యవేక్షిస్తుంది. లోకల్ డెవలప్మెంట్ లేదా టెస్టింగ్ సమయంలో అది 'lazy load'ను గుర్తిస్తే, ఒక ఎక్సెప్షన్ను (exception) విసురుతుంది. ఇది మీరు వెంటనే కోడ్ను సరిచేసేలా చేస్తుంది.
దీనిని ఎలా సెటప్ చేయాలి:
మీ AppServiceProviderలో ఈ సేఫ్టీ మెకానిజంను కాన్ఫిగర్ చేయండి. లోకల్ మరియు టెస్టింగ్ ఎన్విరాన్మెంట్స్ కోసం ఇలా చేయండి. ప్రొడక్షన్లో, యాప్ను క్రాష్ చేసే బదులు ఎర్రర్ను లాగ్ (log) చేయాలి.
మీ boot మెథడ్లో ఈ మూడు సెట్టింగ్లను ఉపయోగించండి:
Model::preventLazyLoading: N+1 క్వెరీలను ఆపుతుంది.Model::preventSilentlyDiscardingAttributes: మాస్ అసైన్మెంట్ (mass assignment) వైఫల్యాలను ఆపుతుంది.Model::preventAccessingMissingAttributes: మిస్సింగ్ రిలేషన్షిప్ల వల్ల కలిగే మెమరీ లీక్లను ఆపుతుంది.
ప్రొడక్షన్ కోసం, handleLazyLoadingViolationUsingని ఉపయోగించండి. ఇది ఉల్లంఘనలను Slack లేదా లాగింగ్ సర్వీస్కు లాగ్ చేయడానికి అనుమతిస్తుంది. దీనివల్ల యూజర్ ఎక్స్పీరియన్స్ దెబ్బతినకుండానే మీకు సమస్యల గురించి స్పష్టత లభిస్తుంది.
Strict Modeని అమలు చేయడం వల్ల ఆప్టిమైజేషన్ మీ పైప్లైన్ ప్రారంభంలోనే జరుగుతుంది. N+1 క్వెరీలు మీ టెస్ట్లను దాటలేవు. మీ కోడ్బేస్ ఆప్టిమైజ్ చేయబడి ఉంటుంది. మీ డేటాబేస్ వేగంగా ఉంటుంది.
Source: https://dev.to/iprajapatiparesh/stop-n1-avalanches-enforce-laravel-strict-mode-2oop