ഒരു Magento ഡെവലപ്പർ 300 പ്രത്യേക ProductRepositoryInterface::getById() കോളുകൾക്ക് പകരം ഒരു സിംഗിൾ കളക്ഷൻ ക്വറി (collection query) ഉപയോഗിച്ചു. ഡാറ്റാബേസ് ഹിറ്റുകൾ 300-ൽ നിന്ന് 1 ആയി കുറഞ്ഞു, കാറ്റഗറി പേജ് വളരെ വേഗത്തിൽ ലോഡ് ആകുകയും ചെയ്തു. എന്നാൽ ഇതിന്റെ പാർശ്വഫലം എന്തായിരുന്നു? ചില ഉൽപ്പന്നങ്ങൾ സ്റ്റോർഫ്രണ്ടിൽ നിന്ന് അപ്രത്യക്ഷമായി, ഇത് ഉപഭോക്താക്കളെയും ഉടമകളെയും കുഴപ്പത്തിലാക്കി.
ഒരു Magento കാറ്റഗറി പേജിലെ N+1 പ്രശ്നം
ആ പേജിൽ 300 ഉൽപ്പന്നങ്ങൾ ലിസ്റ്റ് ചെയ്തിരുന്നു. ഓരോന്നിനും വേണ്ടി കോഡ് റിപ്പോസിറ്ററിയുടെ getById() മെത്തേഡ് വഴി രണ്ട് കസ്റ്റം അറ്റ്രിബ്യൂട്ടുകൾ (custom attributes) എടുക്കുന്നുണ്ടായിരുന്നു. ഇത് ഓരോ ഉൽപ്പന്നത്തിനും ഓരോ ക്വറി വീതം ഉണ്ടാക്കി—ഇതാണ് ക്ലാസിക് N+1 പാറ്റേൺ. ഓരോ ഉൽപ്പന്നത്തിനും പ്രത്യേകം ലോഡ് ചെയ്യുന്നതിന് പകരം, ആവശ്യമായ എല്ലാ വരികളും (rows) ഒരു ക്വറിയിലൂടെ എടുക്കുന്ന ഒരു കളക്ഷൻ ഉപയോഗിച്ചപ്പോൾ ക്വറി എണ്ണം ഗണ്യമായി കുറഞ്ഞു. ഫ്രണ്ട്-എൻഡ് ലേറ്റൻസി മെച്ചപ്പെട്ടെങ്കിലും, മുമ്പ് കാണാറുള്ള ചില ഉൽപ്പന്നങ്ങൾ ഇപ്പോൾ ലിസ്റ്റിൽ നിന്ന് വിട്ടുപോയി.
എന്തുകൊണ്ടാണ് കളക്ഷൻ സ്റ്റോക്ക് ഇല്ലാത്ത ഉൽപ്പന്നങ്ങളെ മറച്ചുവെക്കുന്നത്?
ഫ്രണ്ട്എൻഡിനായി നിർമ്മിക്കുന്ന ഏതൊരു പ്രോഡക്റ്റ് കളക്ഷനിലേക്കും Magento-യുടെ CatalogInventory മോഡ്യൂൾ സ്വയമേവ ഒരു “in-stock” ഫിൽട്ടർ ചേർക്കുന്നുണ്ട്. സ്റ്റോറിൽ ലഭ്യമല്ലാത്ത ഉൽപ്പന്നങ്ങൾ കാണിക്കാൻ ആഗ്രഹിക്കാത്ത വ്യാപാരികൾ സാധാരണയായി ഉപയോഗിക്കുന്ന Display Out of Stock Products എന്ന സെറ്റിംഗ് ഓഫ് ചെയ്യുമ്പോൾ ഈ ഫിൽട്ടർ സജീവമാകുന്നു.
ഇതിനു വിപരീതമായി, റിപ്പോസിറ്ററി ഒരിക്കലും ഒരു സ്റ്റോക്ക് ഫിൽട്ടറും പ്രയോഗിക്കാറില്ല. ഇൻവെന്ററി നില എന്തുതന്നെയായാലും, ഒരു ഉൽപ്പന്നം ഉണ്ടോ എന്ന് പരിശോധിക്കുകയും അത് തിരികെ നൽകുകയും ചെയ്യുക മാത്രമാണ് അത് ചെയ്യുന്നത്. കോഡ് റിപ്പോസിറ്ററി കോളുകളിൽ നിന്ന് ഒരു കളക്ഷനിലേക്ക് മാറിയപ്പോൾ, സ്റ്റോക്ക് ഫിൽട്ടർ സ്റ്റോക്ക് പൂജ്യം ആയ എല്ലാ ഉൽപ്പന്നങ്ങളെയും നിശബ്ദമായി നീക്കം ചെയ്തു. യാതൊരു എററും (error) രേഖപ്പെടുത്തിയില്ല; ഡെവലപ്പർ പ്രതീക്ഷിച്ചതിനേക്കാൾ കുറഞ്ഞ വരികൾ മാത്രമാണ് കളക്ഷൻ നൽകിയത്.
വ്യാപാരികളെ ഇത് എങ്ങനെ ബാധിക്കുന്നു
സ്റ്റോക്ക് ഇല്ലാത്ത SKUs നിശബ്ദമായി ഒഴിവാക്കുന്ന സ്റ്റോർഫ്രണ്ട് പല പ്രശ്നങ്ങളും ഉണ്ടാക്കുന്നു:
- ഫ്രണ്ട്-എൻഡ് കമ്പോണന്റുകൾക്ക് വിവരങ്ങൾ ലഭിക്കാത്തതിനാൽ ശൂന്യമായ ലേബലുകളോ തെറ്റായ വിലയോ കാണിച്ചേക്കാം.
- ഉൽപ്പന്നങ്ങൾ കാണുന്നില്ല എന്നത് ഒരു മുന്നറിയിപ്പും (warning) നൽകുന്നില്ല എന്നതിനാൽ ഡീബഗ്ഗിംഗ് (debugging) പ്രയാസകരമാകുന്നു.
മിക്ക ഓട്ടോമേറ്റഡ് ടെസ്റ്റുകളും സ്റ്റോക്ക് ഉള്ള ഉൽപ്പന്നങ്ങൾ ഉപയോഗിച്ചാണ് നടത്തുന്നതുകൊണ്ട്, യഥാർത്ഥ ഇൻവെന്ററിയുമായി സൈറ്റ് പ്രവർത്തിക്കുന്നത് വരെ ഈ ബഗ് പലപ്പോഴും തിരിച്ചറിയപ്പെടാതെ ഇരിക്കും.
ഇൻവെന്ററി മറച്ചുവെക്കാതെ തന്നെ വേഗത നിലനിർത്തുന്നത് എങ്ങനെ
- ഡിഫോൾട്ട് സ്റ്റോക്ക് ഫിൽട്ടർ ഒഴിവാക്കുക – ലഭ്യത പരിഗണിക്കാതെ എല്ലാ ഉൽപ്പന്നങ്ങളും ആവശ്യമാണെങ്കിൽ കളക്ഷനിൽ നിന്ന് ഫിൽട്ടർ വ്യക്തമായി നീക്കം ചെയ്യുക. ഓരോ ക്വറിക്കും സ്റ്റോക്ക് പ്ലഗിൻ ഡിസേബിൾ ചെയ്യാനോ മാറ്റാനോ ഉള്ള മെത്തേഡുകൾ Magento നൽകുന്നുണ്ട്.
- കൃത്യത പ്രധാനമാണെങ്കിൽ റിപ്പോസിറ്ററി ഉപയോഗിക്കുക – സ്റ്റോക്ക് ഇല്ലെങ്കിൽ പോലും ആവശ്യപ്പെട്ട എല്ലാ പ്രോഡക്റ്റ് ഐഡികളും തിരികെ ലഭിക്കുമെന്ന് റിപ്പോസിറ്ററി ഉറപ്പാക്കുന്നു. അധിക ക്വറികൾ ഒഴിവാക്കാൻ റിസൾട്ടുകൾ കാഷെ (cache) ചെയ്യുകയോ അല്ലെങ്കിൽ ആവശ്യമായ ഐഡികൾ മാത്രം ലോഡ് ചെയ്യുകയോ ചെയ്യുക.
- ഒരു റിസോഴ്സ് മോഡലോ (resource model) അല്ലെങ്കിൽ റോ (raw) SQL-ഓ ഉപയോഗിക്കുക – ആവശ്യമായ അറ്റ്രിബ്യൂട്ടുകൾക്കായി പ്രോഡക്റ്റ് ടേബിളിൽ നേരിട്ട് ക്വറി ചെയ്യുക. ഇത് എല്ലാ കളക്ഷൻ പ്ലഗിനുകളെയും മറികടക്കുകയും ഏത് വരികൾ ഉൾപ്പെടുത്തണം എന്നതിൽ നിങ്ങൾക്ക് പൂർണ്ണ നിയന്ത്രണം നൽകുകയും ചെയ്യുന്നു.
വേഗതയും കൃത്യതയും തമ്മിലുള്ള പോരാട്ടം
ഒരു N+1 ലൂപ്പിന് പകരം ഒരു സിംഗിൾ കളക്ഷൻ ക്വറി ഉപയോഗിക്കുന്നത് സ്വാഭാവികമായി തോന്നാം; ലേറ്റൻസി കുറയുന്നത് വ്യക്തമായി കാണാം. എങ്കിലും, തെറ്റായ ഉൽപ്പന്നങ്ങൾ നൽകുന്ന വേഗതയേറിയ ക്വറി ഒരു ഒപ്റ്റിമൈസേഷൻ അല്ല, മറിച്ച് ഒരു പിഴവാണ് (defect). വേഗതയ്ക്കും അപൂർണ്ണമായ കാറ്റലോഗ് കാണിക്കാനുള്ള സാധ്യതയ്ക്കും ഇടയിൽ ഡെവലപ്പർമാർ കൃത്യമായ ബാലൻസ് നിലനിർത്തണം.
ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ
- കോൺഫിഗറേഷൻ വ്യതിയാനം (Configuration drift) – കസ്റ്റം കളക്ഷൻ കോഡുകളുടെ ഉദ്ദേശ്യത്തിനനുസരിച്ചാണോ Display Out of Stock Products എന്ന ഫ്ലാഗ് പ്രവർത്തിക്കുന്നത് എന്ന് പരിശോധിക്കുക.
- പ്ലഗിൻ സൈഡ് ഇഫക്റ്റുകൾ (Plugin side effects) – മറ്റ് മോഡ്യൂളുകൾ കളക്ഷനുകളിൽ സ്വന്തം ഫിൽട്ടറുകൾ ചേർച്ചേക്കാം. ക്വറി സ്ട്രാറ്റജി മാറ്റുമ്പോൾ പ്ലഗിൻ സ്റ്റാക്ക് പരിശോധിക്കുക.
പാഠം വ്യക്തമാണ്: ഒരു കളക്ഷൻ ഉപയോഗിച്ച് N+1 പ്രശ്നം പരിഹരിക്കുമ്പോൾ, ആ കളക്ഷന്റെ ഡിഫോൾട്ട് ഫിൽട്ടറുകളും പരിശോധിച്ചാൽ മാത്രമേ അത് വിജയകരമാകൂ. Magento-യുടെ ഇൻബിൽറ്റ് സ്റ്റോക്ക് ഫിൽട്ടർ അവഗണിക്കുന്നത് നിങ്ങളുടെ കാറ്റലോഗിനെ നിശബ്ദമായി കുറയ്ക്കുകയും, പെർഫോമൻസ് മെച്ചപ്പെടുത്തൽ വരുമാന നഷ്ടമായി മാറുകയും ചെയ്തേക്കാം.
