ఒక Magento డెవలపర్ 300 విడివిడి ProductRepositoryInterface::getById() కాల్స్‌ను ఒకే ఒక collection queryతో మార్చారు. దీనివల్ల database hits 300 నుండి 1కి తగ్గాయి మరియు category page గణనీయంగా వేగంగా లోడ్ అయ్యింది. అయితే దీని వల్ల కలిగే నష్టం ఏమిటి? కొన్ని ఉత్పత్తులు storefront నుండి మాయమైపోయాయి, దీనివల్ల కొనుగోలుదారులు మరియు యజమానులు అయోమయానికి గురయ్యారు.

Magento category pageలో N+1 సమస్య

ఆ పేజీలో 300 ఉత్పత్తులు జాబితా చేయబడ్డాయి. ప్రతి ఉత్పత్తి కోసం కోడ్ repository యొక్క getById() మెథడ్ ద్వారా రెండు custom attributesలను పొందుతోంది, దీనివల్ల ప్రతి ఉత్పత్తికి ఒక query జనరేట్ అవుతోంది—ఇదే క్లాసిక్ N+1 pattern. ఆ ఒక్కో ఉత్పత్తిని లోడ్ చేసే పద్ధతికి బదులుగా, అవసరమైన అన్ని వరుసలను (rows) ఒకే queryలో తీసుకువచ్చే collectionను ఉపయోగించడం వల్ల queryల సంఖ్య గణనీయంగా తగ్గింది. Front-end latency మెరుగుపడింది, కానీ అంతకుముందు కనిపించిన కొన్ని వస్తువులు ఇప్పుడు product listలో కనిపించడం లేదు.

Collection ఎందుకు out-of-stock వస్తువులను దాచిపెడుతుంది

Magento యొక్క CatalogInventory module, frontend కోసం రూపొందించిన ఏ product collectionకైనా ఆటోమేటిక్‌గా “in-stock” filterను జోడిస్తుంది. స్టోర్ సెట్టింగ్‌లో Display Out of Stock Products ఆప్షన్ ఆఫ్ చేయబడినప్పుడు ఈ filter యాక్టివేట్ అవుతుంది. అందుబాటులో లేని వస్తువులను చూపించకూడదనే ఉద్దేశంతో వ్యాపారులు సాధారణంగా ఈ సెట్టింగ్‌ను ఎంచుకుంటారు.

దీనికి విరుద్ధంగా, repository ఎప్పుడూ stock filterను వర్తింపజేయదు. అది కేవలం ఉత్పత్తి ఉందో లేదో తనిఖీ చేసి, ఇన్వెంటరీ స్థాయితో సంబంధం లేకుండా దానిని తిరిగి ఇస్తుంది. కోడ్ repository కాల్స్ నుండి collectionకు మారినప్పుడు, స్టాక్ సున్నాగా ఉన్న ప్రతి ఉత్పత్తిని stock filter నిశ్శబ్దంగా తొలగించింది. ఎటువంటి error లాగ్ కాలేదు; డెవలపర్ ఆశించిన దానికంటే collection తక్కువ rowsను మాత్రమే తిరిగి ఇచ్చింది.

వ్యాపారులకు దీని అర్థం ఏమిటి

స్టోర్‌ఫ్రంట్ నుండి out-of-stock SKUలను నిశ్శబ్దంగా తొలగించడం వల్ల అనేక సమస్యలు తలెత్తుతాయి:

  • Front-end components లో డేటా లోపించడం వల్ల, ఖాళీ లేబుల్స్ లేదా తప్పు ధరలు కనిపిస్తాయి.
  • ఉత్పత్తులు కనిపించకపోవడం అనేది ఒక సమస్య అయినప్పటికీ, అది ఎటువంటి warnings ఇవ్వదు కాబట్టి debugging చేయడం కష్టమవుతుంది.

చాలా ఆటోమేటెడ్ టెస్ట్‌లు in-stock fixturesని ఉపయోగిస్తాయి కాబట్టి, సైట్ నిజమైన ఇన్వెంటరీతో నడిచే వరకు ఈ బగ్ బయటపడదు.

ఇన్వెంటరీని దాచకుండా వేగాన్ని ఎలా కాపాడుకోవాలి

  1. Default stock filterను స్కిప్ చేయండి – అందుబాటులో ఉన్నా లేకపోయినా మీకు ప్రతి ఉత్పత్తి కావాలంటే, collection నుండి ఆ filterను స్పష్టంగా తొలగించండి. ప్రతి queryకి స్టాక్ pluginను డిసేబుల్ చేయడానికి లేదా రీప్లేస్ చేయడానికి Magento పద్ధతులను అందిస్తుంది.
  2. ఖచ్చితత్వం అవసరమైనప్పుడు repositoryని ఉపయోగించండి – ఉత్పత్తి స్టాక్ లేకపోయినా, కోరిన ప్రతి product ID తిరిగి వస్తుందని repository హామీ ఇస్తుంది. అదనపు queriesని తగ్గించడానికి ఫలితాలను cache చేయండి లేదా మీకు అవసరమైన IDలను మాత్రమే లోడ్ చేయండి.
  3. Resource model లేదా raw SQLని ఉపయోగించండి – అవసరమైన attributes కోసం నేరుగా product tableను క్వరీ చేయండి. ఇది అన్ని collection pluginsలను దాటవేసి, ఏ వరుసలు (rows) చేర్చబడాలో మీకు పూర్తి నియంత్రణను ఇస్తుంది.

వేగం వర్సెస్ ఖచ్చితత్వం

N+1 loopకు బదులుగా ఒకే collection queryని ఉపయోగించడం సహజంగా అనిపిస్తుంది; దీనివల్ల latency తగ్గడం స్పష్టంగా కనిపిస్తుంది. అయినప్పటికీ, తప్పుడు ఉత్పత్తుల జాబితాను ఇచ్చే వేగవంతమైన query అనేది ఒక లోపం (defect), ఆప్టిమైజేషన్ కాదు. డెవలపర్లు కేవలం వేగాన్ని మాత్రమే కాకుండా, అసంపూర్ణ catalogను చూపించే ప్రమాదాన్ని కూడా పరిగణనలోకి తీసుకోవాలి.

తదుపరి జాగ్రత్తలు

  • Configuration driftDisplay Out of Stock Products ఫ్లాగ్, మీరు రాసిన custom collection కోడ్ యొక్క ఉద్దేశ్యానికి అనుగుణంగా ఉందో లేదో సరిచూసుకోండి.
  • Plugin side effects – ఇతర modules కూడా collectionsకు తమ స్వంత filtersలను జోడించవచ్చు. మీరు query strategies మార్చినప్పుడల్లా plugin stackను సమీక్షించండి.

పాఠం స్పష్టంగా ఉంది: collectionతో N+1 సమస్యను పరిష్కరించడం అనేది, ఆ collection యొక్క default filtersను కూడా తనిఖీ చేసినప్పుడు మాత్రమే విజయవంతమవుతుంది. Magento యొక్క built-in stock filterను విస్మరించడం వల్ల మీ catalog నిశ్శబ్దంగా తగ్గిపోవచ్చు, ఇది పెర్ఫార్మెన్స్ మెరుగుదల నుండి ఆదాయ నష్టానికి దారితీస్తుంది.