A Magento developer swapped 300 separate ProductRepositoryInterface::getById() calls for a single collection query. The database hits dropped from 300 to 1, and the category page loaded noticeably faster. The trade-off? Some products vanished from the storefront, baffling shoppers and owners.
Magento category பக்கத்தில் உள்ள N+1 பிரச்சனை
அந்தப் பக்கம் 300 தயாரிப்புகளைப் பட்டியலிட்டது. ஒவ்வொரு தயாரிப்பிற்கும், repository-ன் getById() முறையைப் பயன்படுத்தி இரண்டு custom attributes-களைக் குறியீடு (code) எடுத்தது, இது ஒவ்வொரு தயாரிப்பிற்கும் ஒரு query-ஐ உருவாக்கியது—இதுதான் வழக்கமான N+1 pattern. அந்தத் தனித்தனி தயாரிப்பு லோடுகளை (loads), ஒரே ஒரு query-ல் தேவையான அனைத்து வரிசைகளையும் (rows) எடுக்கும் ஒரு collection மூலம் மாற்றியதன் மூலம், query எண்ணிக்கை பெருமளவு குறைந்தது. Front-end latency மேம்பட்டது, ஆனால் தயாரிப்புப் பட்டியலில் முன்பு இருந்த சில பொருட்கள் இப்போது விடுபட்டிருந்தன.
Collection ஏன் கையிருப்பில் இல்லாத (out-of-stock) பொருட்களை மறைக்கிறது
Magento-வின் CatalogInventory module, frontend-க்காக உருவாக்கப்படும் எந்தவொரு product collection-க்கும் தானாகவே ஒரு “in-stock” filter-ஐச் சேர்க்கிறது. ஸ்டோர் அமைப்பில் (store setting) Display Out of Stock Products என்பது ஆஃப் செய்யப்பட்டிருந்தால் இந்த filter செயல்படும்; கையிருப்பில் இல்லாத பொருட்களைக் காட்ட விரும்பாத வணிகர்களுக்கு இது ஒரு பொதுவான தேர்வாகும்.
இதற்கு நேர்மாறாக, repository ஒருபோதும் stock filter-ஐப் பயன்படுத்துவதில்லை. அது ஒரு தயாரிப்பு இருக்கிறதா என்பதை மட்டும் சரிபார்த்து, அதன் இருப்பைப் (inventory level) பொருட்படுத்தாமல் அதைத் திருப்பித் தரும். குறியீடு repository அழைப்புகளிலிருந்து collection-க்கு மாறியபோது, கையிருப்பு அளவு பூஜ்ஜியமாக இருந்த ஒவ்வொரு தயாரிப்பையும் அந்த stock filter அமைதியாக நீக்கிவிட்டது. எந்தத் தவறுச் செய்தியும் (error log) பதிவாகவில்லை; developer எதிர்பார்த்ததை விட collection குறைவான வரிசைகளையே (rows) வழங்கியது.
இது வணிகர்களுக்கு எதைக் குறிக்கிறது
கையிருப்பில் இல்லாத SKUs-களை அமைதியாகத் தவிர்த்துவிடும் ஒரு storefront பல சிக்கல்களை உருவாக்குகிறது:
- Front-end கூறுகள் (components) விடுபட்ட தகவல்களைப் பெறுவதால், காலியான லேபிள்கள் (labels) அல்லது தவறான விலைகள் உருவாகின்றன.
- விடுபட்ட தயாரிப்புகள் என்பதே ஒரு அறிகுறியாக இருப்பதால், இது எந்த எச்சரிக்கையையும் (warnings) உருவாக்குவதில்லை; இதனால் பிழையைக் கண்டறிவது (debugging) கடினமாகிறது.
பெரும்பாலான தானியங்கிச் சோதனைகள் (automated tests) கையிருப்பில் உள்ள தயாரிப்புகளைக் கொண்டே (in-stock fixtures) செய்யப்படுவதால், உண்மையான கையிருப்பில் இணையதளம் இயங்கும் வரை இந்த பிழை பெரும்பாலும் மறைந்தே இருக்கும்.
கையிருப்பை மறைக்காமல் வேகத்தைப் பராமரிப்பது எப்படி
- Default stock filter-ஐத் தவிர்க்கவும் – கையிருப்பைப் பொருட்படுத்தாமல் ஒவ்வொரு தயாரிப்பும் உங்களுக்குத் தேவைப்பட்டால், collection-லிருந்து அந்த filter-ஐத் தெளிவாக நீக்கவும். ஒவ்வொரு query-க்கும் stock plugin-ஐ முடக்குவதற்கு அல்லது மாற்றியமைப்பதற்கு Magento முறைகளை வழங்குகிறது.
- துல்லியம் முக்கியம் எனும்போது repository-யைப் பயன்படுத்தவும் – ஒரு தயாரிப்பு கையிருப்பில் இல்லாவிட்டாலும், கோரப்பட்ட ஒவ்வொரு product ID-யும் திரும்பக் கிடைப்பதை repository உறுதி செய்கிறது. கூடுதல் query-களைக் குறைக்க முடிவுகளை cache செய்யலாம் அல்லது உங்களுக்குத் தேவையான ID-களை மட்டும் ஏற்றலாம்.
- Resource model அல்லது raw SQL-ஐப் பயன்படுத்தவும் – தேவையான attributes-களுக்காக நேரடியாக product table-ஐ query செய்யவும். இது அனைத்து collection plugins-களையும் தவிர்த்து, எந்த வரிசைகள் (rows) சேர்க்கப்பட வேண்டும் என்பதில் உங்களுக்கு முழுமையான கட்டுப்பாட்டை வழங்குகிறது.
வேகம் மற்றும் துல்லியம்
அதிகப்படியான N+1 loop-க்கு பதிலாக ஒரே ஒரு collection query-யைப் பயன்படுத்துவது இயல்பாகத் தோன்றலாம்; அதன் latency குறைவு கண்களுக்குத் புலப்படும் வகையில் இருக்கும். இருப்பினும், தவறான தயாரிப்புப் பட்டியலைத் தரும் வேகமான query ஒரு குறைபாடே (defect) தவிர, மேம்படுத்தல் (optimization) அல்ல. முழுமையற்ற பட்டியலைக் காண்பிக்கும் அபாயத்திற்கும், வேகத்திற்கும் இடையே டெவலப்பர்கள் சமநிலையைத் தீர்மானிக்க வேண்டும்.
அடுத்து எவற்றைக் கவனிக்க வேண்டும்
- Configuration drift – Display Out of Stock Products என்ற flag, உங்கள் custom collection குறியீட்டின் நோக்கத்துடன் ஒத்துப்போகிறதா என்பதைச் சரிபார்க்கவும்.
- Plugin side effects – பிற modules collections-களுக்குத் தமக்கென சில filters-களைச் சேர்க்கலாம். நீங்கள் query உத்திகளை மாற்றும் போதெல்லாம் plugin stack-ஐ மறுஆய்வு செய்யவும்.
பாடம் தெளிவானது: ஒரு collection மூலம் N+1 சிக்கலைச் சரிசெய்வது, அந்த collection-ன் default filters-களையும் நீங்கள் ஆய்வு செய்தால்தான் வெற்றிகரமானதாக அமையும். Magento-வின் built-in stock filter-ஐப் புறக்கணிப்பது உங்கள் தயாரிப்புப் பட்டியலை அமைதியாகக் குறைத்துவிடும், இது செயல்திறன் அதிகரிப்பை வருவாய் இழப்பாக மாற்றக்கூடும்.
