𝗦𝘁𝗼𝗽 𝗡+𝟭 𝗔𝘃𝗮𝗹𝗮𝗻𝗰𝗵𝗲𝘀: 𝗘𝗻𝗳𝗼𝗿𝗰𝗲 𝗟𝗮𝗿𝗮𝘃𝗲𝗹 𝗦𝘁𝗿𝗶𝗰𝘁 𝗠𝗼𝗱𝗲
N+1 ಕ್ವೆರಿ ಸಮಸ್ಯೆ ಡೇಟಾಬೇಸ್ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಹಾಳುಮಾಡುತ್ತದೆ. ನೀವು ದಾಖಲೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದು, ಸಂಬಂಧಿತ ಡೇಟಾವನ್ನು (relationship) ಪಡೆಯಲು ಅವುಗಳ ಮೂಲಕ ಲೂಪ್ ಮಾಡಿದಾಗ ಇದು ಸಂಭವಿಸುತ್ತದೆ. ನೀವು ಆ ಸಂಬಂಧವನ್ನು ಮೊದಲೇ ಲೋಡ್ ಮಾಡಲು ಮರೆತಿದ್ದೀರಿ ಎಂದರ್ಥ.
ಉದಾಹರಣೆಗೆ, ನೀವು ಡ್ಯಾಶ್ಬೋರ್ಡ್ನಲ್ಲಿ 50 ಇನ್ವಾಯ್ಸ್ಗಳನ್ನು ತೋರಿಸುತ್ತೀರಿ ಎಂದು ಭಾವಿಸೋಣ. ಕ್ಲೈಂಟ್ ಹೆಸರನ್ನು ತೋರಿಸಲು ನೀವು ಅವುಗಳ ಮೂಲಕ ಲೂಪ್ ಮಾಡುತ್ತೀರಿ. ಆದರೆ ನೀವು with ಮೆಥಡ್ ಬಳಸಲು ಮರೆತಿದ್ದೀರಿ. Eloquent ಇನ್ವಾಯ್ಸ್ಗಳಿಗಾಗಿ 1 ಕ್ವೆರಿಯನ್ನು ರನ್ ಮಾಡುತ್ತದೆ. ನಂತರ ಪ್ರತಿ ಕ್ಲೈಂಟ್ಗಾಗಿ 50 ಪ್ರತ್ಯೇಕ ಕ್ವೆರಿಗಳನ್ನು ರನ್ ಮಾಡುತ್ತದೆ.
ಲೋಕಲ್ ಡೆವಲಪ್ಮೆಂಟ್ನಲ್ಲಿ, 51 ಕ್ವೆರಿಗಳು 10 ಮಿಲಿಸೆಕೆಂಡ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತವೆ. ನೀವು ಇದನ್ನು ಗಮನಿಸುವುದಿಲ್ಲ. ಆದರೆ ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ, ಹೆಚ್ಚಿನ ಟ್ರಾಫಿಕ್ ಇದನ್ನು ದೊಡ್ಡ ಅವಲಂಚೆಯನ್ನಾಗಿ (avalanche) ಬದಲಾಯಿಸುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ ಕನೆಕ್ಷನ್ ಪೂಲ್ ಅನ್ನು ಖಾಲಿ ಮಾಡುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಸರ್ವರ್ ಅನ್ನು ಕ್ರ್ಯಾಶ್ ಮಾಡುತ್ತದೆ.
ನೀವು ಕೇವಲ ಕೋಡ್ ರಿವ್ಯೂಗಳ ಮೇಲೆ ಮಾತ್ರ ಅವಲಂಬಿತರಾಗಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮಗೆ ಒಂದು ಆರ್ಕಿಟೆಕ್ಚರಲ್ ಗಾರ್ಡ್ರೈಲ್ (architectural guardrail) ಅಗತ್ಯವಿದೆ.
ಇದನ್ನು ಪರಿಹರಿಸಲು Laravel Strict Mode ಅನ್ನು ನೀಡುತ್ತದೆ. ನೀವು ಅಪ್ಲಿಕೇಶನ್ ಮಟ್ಟದಲ್ಲಿ preventLazyLoading ಅನ್ನು ಬಳಸಬಹುದು. Laravel ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ ಸಂಬಂಧಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುತ್ತದೆ. ಲೋಕಲ್ ಡೆವಲಪ್ಮೆಂಟ್ ಅಥವಾ ಟೆಸ್ಟಿಂಗ್ ಸಮಯದಲ್ಲಿ ಅದು lazy load ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿದರೆ, ಅದು ಎಕ್ಸೆಪ್ಶನ್ (exception) ಅನ್ನು ಎಸೆಯುತ್ತದೆ. ಇದು ನೀವು ತಕ್ಷಣವೇ ಕೋಡ್ ಅನ್ನು ಸರಿಪಡಿಸುವಂತೆ ಮಾಡುತ್ತದೆ.
ಇದನ್ನು ಹೇಗೆ ಸೆಟ್ ಅಪ್ ಮಾಡುವುದು:
ನಿಮ್ಮ AppServiceProvider ನಲ್ಲಿ ಸುರಕ್ಷತಾ ಕಾರ್ಯವಿಧಾನವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ. ಇದನ್ನು ಲೋಕಲ್ ಮತ್ತು ಟೆಸ್ಟಿಂಗ್ ಎನ್ವಿರಾನ್ಮೆಂಟ್ಗಳಿಗಾಗಿ ಮಾಡಿ. ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ, ಅಪ್ಲಿಕೇಶನ್ ಕ್ರ್ಯಾಶ್ ಆಗುವ ಬದಲು ನೀವು ದೋಷವನ್ನು (error) ಲಾಗ್ ಮಾಡಬೇಕು.
ನಿಮ್ಮ boot ಮೆಥಡ್ನಲ್ಲಿ ಈ ಮೂರು ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಸಿ:
Model::preventLazyLoading: N+1 ಕ್ವೆರಿಗಳನ್ನು ತಡೆಯುತ್ತದೆ.Model::preventSilentlyDiscardingAttributes: mass assignment ವೈಫಲ್ಯಗಳನ್ನು ತಡೆಯುತ್ತದೆ.Model::preventAccessingMissingAttributes: ಸಂಬಂಧಿತ ಡೇಟಾ ಇಲ್ಲದ ಕಾರಣ ಉಂಟಾಗುವ ಮೆಮೊರಿ ಲೀಕ್ಗಳನ್ನು ತಡೆಯುತ್ತದೆ.
ಪ್ರೊಡಕ್ಷನ್ಗಾಗಿ, handleLazyLoadingViolationUsing ಬಳಸಿ. ಇದು ಉಲ್ಲಂಘನೆಗಳನ್ನು (violations) Slack ಅಥವಾ ಲಾಗಿಂಗ್ ಸರ್ವಿಸ್ಗೆ ಲಾಗ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಬಳಕೆದಾರರ ಅನುಭವಕ್ಕೆ ತೊಂದರೆಯಾಗದಂತೆ ನಿಮಗೆ ದೃಶ್ಯತೆಯನ್ನು (visibility) ನೀಡುತ್ತದೆ.
Strict Mode ಅನ್ನು ಜಾರಿಗೊಳಿಸುವುದರಿಂದ ಆಪ್ಟಿಮೈಸೇಶನ್ ನಿಮ್ಮ ಪೈಪ್ಲೈನ್ನ ಆರಂಭದಲ್ಲೇ ನಡೆಯುತ್ತದೆ. N+1 ಕ್ವೆರಿಗಳು ನಿಮ್ಮ ಟೆಸ್ಟ್ಗಳನ್ನು ದಾಟಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಕೋಡ್ಬೇಸ್ ಆಪ್ಟಿಮೈಸ್ ಆಗಿರುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ ವೇಗವಾಗಿ ಇರುತ್ತದೆ.
Source: https://dev.to/iprajapatiparesh/stop-n1-avalanches-enforce-laravel-strict-mode-2oop