N+1 அவலஞ்சுகளைத் தடுத்து நிறுத்துங்கள்: Laravel Strict Mode-ஐக் கட்டாயமாக்குங்கள்
N+1 query பிரச்சனை தரவுத்தளத்தின் (database) செயல்திறனைப் பாதிக்கிறது. நீங்கள் பதிவுகளின் பட்டியலைப் பெற்று, ஒரு உறவை (relationship) அணுக அவற்றின் வழியாக லூப் (loop) செய்யும்போது இது நிகழ்கிறது. அந்த உறவை முன்கூட்டியே ஏற்ற (load) நீங்கள் மறந்துவிட்டீர்கள்.
ஒரு டேஷ்போர்டில் (dashboard) 50 இன்வாய்ஸ்களைக் (invoices) காண்பிக்கிறீர்கள் என்று வைத்துக்கொள்வோம். வாடிக்கையாளர் பெயரைத் தெரிவியுங்கள் என்பதற்காக நீங்கள் அவற்றின் வழியாக லூப் செய்கிறீர்கள். with முறையைப் பயன்படுத்த நீங்கள் மறந்துவிட்டீர்கள். Eloquent இன்வாய்ஸ்களுக்காக 1 query-ஐ இயக்குகிறது. பின்னர் ஒவ்வொரு வாடிக்கையாளருக்கும் தனித்தனியாக 50 query-களை இயக்குகிறது.
லோக்கல் டெவலப்மெண்டில் (local development), 51 query-கள் 10 மில்லிசெகண்டுகளை மட்டுமே எடுத்துக்கொள்ளும். நீங்கள் அதைத் தற்செயலாகக் கூட உணரமாட்டீர்கள். ஆனால் ப்ரொடக்ஷனில் (production), அதிகப்படியான டிராஃபிக் (traffic) இதை ஒரு பெரும் பேரழிவாக (avalanche) மாற்றும். இது உங்கள் database connection pool-ஐத் தீர்த்துப்போட்டு, உங்கள் சர்வரை முடக்கிவிடும் (crash).
நீங்கள் வெறும் கோட் ரிவியூக்களை (code reviews) மட்டுமே நம்பியிருக்க முடியாது. உங்களுக்கு ஒரு கட்டமைப்பு பாதுகாப்பு (architectural guardrail) தேவை.
இதைத் தீர்க்க Laravel Strict Mode-ஐ வழங்குகிறது. நீங்கள் அப்ளிகேஷன் மட்டத்தில் (application level) preventLazyLoading-ஐப் பயன்படுத்தலாம். Laravel உங்கள் database உறவுகளைக் கண்காணிக்கும். லோக்கல் டெவலப்மெண்ட் அல்லது டெஸ்டிங் (testing) செய்யும்போது அது ஒரு lazy load-ஐக் கண்டறிந்தால், ஒரு exception-ஐத் தூண்டும். இது நீங்கள் உடனடியாகக் குறியீட்டை (code) சரிசெய்யக் கட்டாயப்படுத்துகிறது.
இதை எவ்வாறு அமைப்பது:
உங்கள் AppServiceProvider-இல் பாதுகாப்பு வழிமுறையை (safety mechanism) உள்ளமைக்கவும் (configure). இதை local மற்றும் testing சூழல்களுக்குச் செய்யவும். ப்ரொடக்ஷனில், அப்ளிகேஷனை முடக்குவதற்குப் பதிலாக பிழையை (error) லாக் (log) செய்ய வேண்டும்.
உங்கள் boot மெத்தடில் (method) இந்த மூன்று அமைப்புகளையும் பயன்படுத்தவும்:
Model::preventLazyLoading: N+1 queries-ஐத் தடுக்கிறது.Model::preventSilentlyDiscardingAttributes: mass assignment தோல்விகளைத் தடுக்கிறது.Model::preventAccessingMissingAttributes: விடுபட்ட உறவுகளால் ஏற்படும் memory leaks-ஐத் தடுக்கிறது.
ப்ரொடக்ஷனுக்காக, handleLazyLoadingViolationUsing-ஐப் பயன்படுத்தவும். இது விதிமீறல்களை (violations) Slack அல்லது ஒரு logging service-க்கு லாக் செய்ய அனுமதிக்கிறது. பயனர் அனுபவத்தைப் (user experience) பாதிக்காமல், உங்களுக்குத் தெளிவான பார்வையைப் (visibility) பெற இது உதவும்.
Strict Mode-ஐக் கட்டாயப்படுத்துவது, உகப்பாக்கத்தை (optimization) உங்கள் பைப்லைனின் (pipeline) தொடக்கத்திலேயே கொண்டு வருகிறது. N+1 queries உங்கள் டெஸ்ட்களைத் தாண்ட முடியாது. உங்கள் codebase எப்போதும் உகப்பாக்கப்பட்ட நிலையிலேயே இருக்கும். உங்கள் database வேகமாகவும் இருக்கும்.
ஆதாரம்: https://dev.to/iprajapatiparesh/stop-n1-avalanches-enforce-laravel-strict-mode-2oop