એક Magento ડેવલપરે 300 અલગ-અલગ ProductRepositoryInterface::getById() કોલ્સને બદલે સિંગલ કલેક્શન ક્વેરીનો ઉપયોગ કર્યો. ડેટાબેઝ હિટ્સ 300 થી ઘટીને 1 થઈ ગયા, અને કેટેગરી પેજ નોંધપાત્ર રીતે ઝડપથી લોડ થયું. તેના બદલામાં શું મળ્યું? સ્ટોરફ્રન્ટમાંથી કેટલાક પ્રોડક્ટ્સ ગાયબ થઈ ગયા, જેનાથી ગ્રાહકો અને માલિકો બંને મૂંઝવણમાં મુકાયા.

Magento કેટેગરી પેજ પર N+1 સમસ્યા

પેજ પર 300 પ્રોડક્ટ્સની યાદી હતી. દરેક પ્રોડક્ટ માટે કોડ રિપોઝિટરીના getById() મેથડ દ્વારા બે કસ્ટમ એટ્રિબ્યુટ્સ મેળવતો હતો, જેનાથી દરેક પ્રોડક્ટ માટે એક ક્વેરી જનરેટ થતી હતી—આ ક્લાસિક N+1 પેટર્ન છે. આ દરેક પ્રોડક્ટના લોડને બદલે એક કલેક્શનનો ઉપયોગ કરવાથી, જે એક જ ક્વેરીમાં તમામ જરૂરી રો (rows) ખેંચી લે છે, ક્વેરીની સંખ્યામાં મોટો ઘટાડો થયો. ફ્રન્ટ-એન્ડ લેટન્સી (latency) સુધરી, પરંતુ પ્રોડક્ટ લિસ્ટમાં હવે એવી વસ્તુઓ ખૂટતી હતી જે અગાઉ દેખાતી હતી.

કલેક્શન આઉટ-ઓફ-સ્ટોક આઈટમ્સને કેમ છુપાવે છે

Magento નું CatalogInventory મોડ્યુલ ફ્રન્ટએન્ડ માટે બનાવવામાં આવેલા કોઈપણ પ્રોડક્ટ કલેક્શનમાં આપમેળે "in-stock" ફિલ્ટર ઉમેરે છે. જ્યારે સ્ટોર સેટિંગ Display Out of Stock Products બંધ હોય ત્યારે આ ફિલ્ટર સક્રિય થાય છે, જે એવા વેપારીઓ માટે સામાન્ય પસંદગી છે જેઓ ઉપલબ્ધ ન હોય તેવી વસ્તુઓ બતાવવા માંગતા નથી.

તેનાથી વિપરીત, રિપોઝિટરી ક્યારેય સ્ટોક ફિલ્ટર લાગુ કરતી નથી. તે ફક્ત એ તપાસે છે કે પ્રોડક્ટ અસ્તિત્વમાં છે કે નહીં અને ઇન્વેન્ટરી લેવલ ગમે તે હોય, તેને રિટર્ન કરે છે. જ્યારે કોડ રિપોઝિટરી કોલ્સમાંથી કલેક્શન પર સ્વિચ થયો, ત્યારે સ્ટોક ફિલ્ટરે શાંતિથી એવી દરેક પ્રોડક્ટને દૂર કરી દીધી જેનું ક્વોન્ટિટી શૂન્ય હતું. કોઈ એરર લોગ થઈ નહીં; કલેક્શને ડેવલપરની અપેક્ષા કરતા ઓછા રો (rows) રિટર્ન કર્યા.

વેપારીઓ માટે આનો અર્થ શું છે

એક સ્ટોરફ્રન્ટ જે આઉટ-ઓફ-સ્ટોક SKUs ને શાંતિથી દૂર કરે છે તે ઘણી સમસ્યાઓ ઊભી કરે છે:

  • ફ્રન્ટ-એન્ડ ઘટકો (components) અધૂરી એન્ટ્રીઓ મેળવે છે, જેના કારણે ખાલી લેબલ્સ અથવા ખોટી કિંમતો જોવા મળે છે.
  • ડિબગિંગ (Debugging) મુશ્કેલ બની જાય છે કારણ કે આ લક્ષણ—પ્રોડક્ટ્સનું ગાયબ થવું—કોઈ ચેતવણી (warnings) જનરેટ કરતું નથી.

કારણ કે મોટાભાગના ઓટોમેટેડ ટેસ્ટ ઇન-સ્ટોક ફિક્સ્ચર્સ (fixtures) નો ઉપયોગ કરે છે, તેથી સાઇટ વાસ્તવિક ઇન્વેન્ટરી સાથે ચાલવા લાગે ત્યાં સુધી આ બગ (bug) ઘણીવાર છુપાયેલો રહે છે.

ઇન્વેન્ટરી છુપાવ્યા વિના ઝડપ કેવી રીતે જાળવવી

  1. ડિફોલ્ટ સ્ટોક ફિલ્ટરને સ્કીપ કરો – જો તમારે ઉપલબ્ધતાને ધ્યાનમાં લીધા વિના દરેક પ્રોડક્ટની જરૂર હોય, તો કલેક્શનમાંથી ફિલ્ટરને સ્પષ્ટપણે દૂર કરો. Magento દરેક ક્વેરી દીઠ સ્ટોક પ્લગઇનને ડિસેબલ કરવા અથવા બદલવા માટે મેથડ્સ ઓફર કરે છે.
  2. જ્યારે ચોકસાઈ મહત્વની હોય ત્યારે રિપોઝિટરીનો ઉપયોગ કરો – રિપોઝિટરી ખાતરી આપે છે કે દરેક વિનંતી કરેલ પ્રોડક્ટ ID રિટર્ન થાય છે, ભલે તે આઉટ-ઓફ-સ્ટોક હોય. વધારાની ક્વેરીઝને નિયંત્રિત કરવા માટે પરિણામોને કેશ (cache) કરો અથવા ફક્ત તમને જરૂરી ID જ લોડ કરો.
  3. રિસોર્સ મોડલ અથવા રો (raw) SQL નો ઉપયોગ કરો – જરૂરી એટ્રિબ્યુટ્સ માટે સીધું પ્રોડક્ટ ટેબલ ક્વેરી કરો. આ તમામ કલેક્શન પ્લગઇન્સને બાયપાસ કરે છે અને તમને કયા રો (rows) સામેલ કરવા તે પર સંપૂર્ણ નિયંત્રણ આપે છે.

ઝડપ વિરુદ્ધ ચોકસાઈ

અવાજ પેદા કરતા (noisy) N+1 લૂપને બદલે સિંગલ કલેક્શન ક્વેરીનો ઉપયોગ કરવો સ્વાભાવિક લાગે છે; લેટન્સીમાં ઘટાડો સ્પષ્ટ દેખાય છે. છતાં, ખોટી પ્રોડક્ટ્સ રિટર્ન કરતી ઝડપી ક્વેરી એ ખામી (defect) છે, ઓપ્ટિમાઇઝેશન નથી. ડેવલપર્સે અધૂરો કેટલોગ બતાવવાના જોખમ સામે કાચી ઝડપનું વજન કરવું જોઈએ.

આગળ શું ધ્યાન રાખવું

  • કોન્ફિગરેશન ડ્રિફ્ટ (Configuration drift) – ખાતરી કરો કે Display Out of Stock Products ફ્લેગ કોઈપણ કસ્ટમ કલેક્શન કોડના નિર્ધારિત વર્તનને અનુરૂપ છે.
  • પ્લગઇન સાઇડ ઇફેક્ટ્સ (Plugin side effects) – અન્ય મોડ્યુલ્સ કલેક્શનમાં તેમના પોતાના ફિલ્ટર્સ ઉમેરી શકે છે. જ્યારે પણ તમે ક્વેરી વ્યૂહરચના બદલો ત્યારે પ્લગઇન સ્ટેક (plugin stack) ની સમીક્ષા કરો.

પાઠ સ્પષ્ટ છે: કલેક્શન સાથે N+1 સમસ્યાને સુધારવાથી ત્યારે જ ફાયદો થાય છે જો તમે કલેક્શનના ડિફોલ્ટ ફિલ્ટર્સનું પણ ઓડિટ કરો. Magento ના ઇન-બિલ્ટ સ્ટોક ફિલ્ટરને અવગણવાથી તમારો કેટલોગ શાંતિથી કપાઈ શકે છે, જે પરફોર્મન્સના ફાયદાને આવક નુકસાનમાં ફેરવી શકે છે.