N+1 ક્વેરીના પ્રવાહને અટકાવો: Laravel Strict Mode લાગુ કરો
N+1 ક્વેરીની સમસ્યા ડેટાબેઝના પર્ફોર્મન્સને નષ્ટ કરી દે છે. જ્યારે તમે રેકોર્ડ્સની યાદી મેળવો છો અને રિલેશનશિપ (relationship) એક્સેસ કરવા માટે તેના પર લૂપ (loop) ચલાવો છો, ત્યારે આવું થાય છે. તમે તે રિલેશનશિપને અગાઉથી લોડ કરવાનું ભૂલી ગયા હોવ છો.
ધારો કે તમે ડેશબોર્ડ પર 50 ઇન્વોઇસ (invoices) બતાવો છો. ક્લાયન્ટનું નામ બતાવવા માટે તમે તેના પર લૂપ ચલાવો છો. તમે with મેથડનો ઉપયોગ કરવાનું ભૂલી ગયા છો. Eloquent ઇન્વોઇસ માટે 1 ક્વેરી ચલાવે છે. ત્યારબાદ તે દરેક ક્લાયન્ટ માટે 50 અલગ-અલગ ક્વેરી ચલાવે છે.
લોકલ ડેવલપમેન્ટમાં, 51 ક્વેરી માટે માત્ર 10 મિલીસેકન્ડ લાગે છે. તમને તેની ખબર પણ નહીં પડે. પરંતુ પ્રોડક્શનમાં, ભારે ટ્રાફિક આ સમસ્યાને એક મોટા પ્રવાહ (avalanche) માં ફેરવી દે છે. તે તમારા ડેટાબેઝ કનેક્શન પૂલને ખાલી કરી દે છે અને તમારા સર્વરને ક્રેશ કરી શકે છે.
તમે માત્ર કોડ રિવ્યુ પર જ નિર્ભર રહી શકતા નથી. તમારે એક આર્કિટેક્ચરલ ગાર્ડરેલ (architectural guardrail) ની જરૂર છે.
Laravel આ સમસ્યાના ઉકેલ માટે Strict Mode પ્રદાન કરે છે. તમે એપ્લિકેશન લેવલ પર preventLazyLoading નો ઉપયોગ કરી શકો છો. Laravel તમારા ડેટાબેઝ રિલેશનશિપ પર દેખરેખ રાખશે. જો તે લોકલ ડેવલપમેન્ટ અથવા ટેસ્ટિંગ દરમિયાન 'lazy load' શોધશે, તો તે એક્સેપ્શન (exception) ફેંકશે. આ તમને તરત જ કોડ સુધારવા માટે મજબૂર કરશે.
આ કેવી રીતે સેટ કરવું:
તમારા AppServiceProvider માં સેફ્ટી મિકેનિઝમ કન્ફિગર કરો. લોકલ અને ટેસ્ટિંગ એન્વાયરમેન્ટ માટે આવું કરો. પ્રોડક્શનમાં, એપ્લિકેશન ક્રેશ કરવાને બદલે તમારે એરર લોગ (log) કરવી જોઈએ.
તમારા boot મેથડમાં આ ત્રણ સેટિંગ્સનો ઉપયોગ કરો:
Model::preventLazyLoading: N+1 ક્વેરી અટકાવે છે.Model::preventSilentlyDiscardingAttributes: Mass assignment નિષ્ફળતા અટકાવે છે.Model::preventAccessingMissingAttributes: ખૂટતી રિલેશનશિપને કારણે થતા મેમરી લીક (memory leaks) અટકાવે છે.
પ્રોડક્શન માટે, handleLazyLoadingViolationUsing નો ઉપયોગ કરો. આ તમને Slack અથવા લોગિંગ સર્વિસમાં ઉલ્લંઘનો (violations) લોગ કરવાની મંજૂરી આપે છે. આનાથી યુઝર એક્સપિરિયન્સ બગાડ્યા વગર તમને વિઝિબિલિટી મળશે.
Strict Mode લાગુ કરવાથી ઓપ્ટિમાઇઝેશન તમારા પાઇપલાઇનના શરૂઆતમાં જ આવી જાય છે. N+1 ક્વેરી તમારા ટેસ્ટમાંથી પસાર થઈ શકશે નહીં. તમારો કોડબેઝ ઓપ્ટિમાઇઝ્ડ રહેશે. તમારો ડેટાબેઝ ફાસ્ટ રહેશે.
સ્ત્રોત: https://dev.to/iprajapatiparesh/stop-n1-avalanches-enforce-laravel-strict-mode-2oop