ಒಬ್ಬ Magento ಡೆವಲಪರ್ 300 ಪ್ರತ್ಯೇಕ ProductRepositoryInterface::getById() ಕರೆಗಳನ್ನು ಒಂದೇ ಕಲೆಕ್ಷನ್ ಕ್ವೇರಿಗಾಗಿ (collection query) ಬದಲಾಯಿಸಿದರು. ಡೇಟಾಬೇಸ್ ಹಿಟ್ಸ್ 300 ರಿಂದ 1 ಕ್ಕೆ ಇಳಿದವು ಮತ್ತು ಕ್ಯಾಟಗರಿ ಪೇಜ್ ಗಮನಾರ್ಹವಾಗಿ ವೇಗವಾಗಿ ಲೋಡ್ವಾಯಿತು. ಆದರೆ ಇದರ ಬೆಲೆ ಏನೆಂದರೆ? ಕೆಲವು ಉತ್ಪನ್ನಗಳು ಸ್ಟೋರ್‌ಫ್ರಂಟ್‌ನಿಂದ ಮಾಯವಾದವು, ಇದು ಗ್ರಾಹಕರು ಮತ್ತು ಮಾಲೀಕರನ್ನು ಗೊಂದಲಕ್ಕೀಡುಮಾಡಿತು.

Magento ಕ್ಯಾಟಗರಿ ಪೇಜ್‌ನಲ್ಲಿನ N+1 ಸಮಸ್ಯೆ

ಆ ಪೇಜ್‌ನಲ್ಲಿ 300 ಉತ್ಪನ್ನಗಳ ಪಟ್ಟಿ ಇತ್ತು. ಪ್ರತಿಯೊಂದಕ್ಕೂ ಕೋಡ್ ರೆಪೊಸಿಟರಿಯ getById() ವಿಧಾನದ ಮೂಲಕ ಎರಡು ಕಸ್ಟಮ್ ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳನ್ನು (custom attributes) ಪಡೆದುಕೊಳ್ಳುತ್ತಿತ್ತು, ಇದು ಪ್ರತಿ ಉತ್ಪನ್ನಕ್ಕೆ ಒಂದು ಕ್ವೇರಿಯನ್ನು ಸೃಷ್ಟಿಸುತ್ತಿತ್ತು—ಇದು ಸಾಂಪ್ರದಾಯಿಕ N+1 ಮಾದರಿಯಾಗಿದೆ. ಆ ಪ್ರತಿ-ಉತ್ಪನ್ನ ಲೋಡ್‌ಗಳ ಬದಲಿಗೆ, ಅಗತ್ಯವಿರುವ ಎಲ್ಲಾ ಸಾಲುಗಳನ್ನು (rows) ಒಂದೇ ಕ್ವೇರಿಯಲ್ಲಿ ಪಡೆಯುವ ಕಲೆಕ್ಷನ್ ಬಳಸಿದಾಗ ಕ್ವೇರಿಗಳ ಸಂಖ್ಯೆ ಗಣನೀಯವಾಗಿ ಕಡಿಮೆಯಾಯಿತು. ಫ್ರಂಟ್-ಎಂಡ್ ವಿಳಂಬವು (latency) ಸುಧಾರಿಸಿತು, ಆದರೆ ಉತ್ಪನ್ನಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಮೊದಲು ಕಾಣಿಸುತ್ತಿದ್ದ ಕೆಲವು ಐಟಂಗಳು ಈಗ ಕಾಣಿಸದೆ ಹೋದವು.

ಕಲೆಕ್ಷನ್ ಏಕೆ ಸ್ಟಾಕ್ ಇಲ್ಲದ (out-of-stock) ಐಟಂಗಳನ್ನು ಮರೆಮಾಚುತ್ತದೆ?

Magento ನ CatalogInventory ಮಾಡ್ಯೂಲ್ ಫ್ರಂಟ್‌ಎಂಡ್‌ಗಾಗಿ ನಿರ್ಮಿಸಲಾದ ಯಾವುದೇ ಪ್ರಾಡಕ್ಟ್ ಕಲೆಕ್ಷನ್‌ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ "in-stock" ಫಿಲ್ಟರ್ ಅನ್ನು ಸೇರಿಸುತ್ತದೆ. ಸ್ಟೋರ್ ಸೆಟ್ಟಿಂಗ್‌ನಲ್ಲಿ Display Out of Stock Products ಎಂಬ ಆಯ್ಕೆಯನ್ನು ಆಫ್ ಮಾಡಿದಾಗ ಈ ಫಿಲ್ಟರ್ ಸಕ್ರಿಯಗೊಳ್ಳುತ್ತದೆ. ಲಭ್ಯವಿಲ್ಲದ ಐಟಂಗಳನ್ನು ತೋರಿಸಲು ಇಷ್ಟಪಡದ ವ್ಯಾಪಾರಿಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಈ ಆಯ್ಕೆಯನ್ನು ಬಳಸುತ್ತಾರೆ.

ಇದಕ್ಕೆ ವ್ಯತಿರಿಕ್ತವಾಗಿ, ರೆಪೊಸಿಟರಿಯು ಎಂದಿಗೂ ಸ್ಟಾಕ್ ಫಿಲ್ಟರ್ ಅನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ. ಅದು ಕೇವಲ ಉತ್ಪನ್ನವು ಅಸ್ತಿತ್ವದಲ್ಲಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುತ್ತದೆ ಮತ್ತು ಇನ್ವೆಂಟರಿ ಮಟ್ಟವನ್ನು ಲೆಕ್ಕಿಸದೆ ಅದನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಕೋಡ್ ರೆಪೊಸಿಟರಿ ಕರೆಗಳಿಂದ ಕಲೆಕ್ಷನ್‌ಗೆ ಬದಲಾದಾಗ, ಸ್ಟಾಕ್ ಫಿಲ್ಟರ್ ಶೂನ್ಯ ಪ್ರಮಾಣವಿರುವ (zero quantity) ಪ್ರತಿಯೊಂದು ಉತ್ಪನ್ನವನ್ನು ಮೌನವಾಗಿ ತೆಗೆದುಹಾಕಿತು. ಯಾವುದೇ ಎರರ್ ಲಾಗ್ ಆಗಲಿಲ್ಲ; ಕಲೆಕ್ಷನ್ ಕೇವಲ ಡೆವಲಪರ್ ನಿರೀಕ್ಷಿಸಿದ್ದಕ್ಕಿಂತ ಕಡಿಮೆ ಸಾಲುಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿತು.

ಇದು ವ್ಯಾಪಾರಿಗಳಿಗೆ ಏನನ್ನು ಸೂಚಿಸುತ್ತದೆ?

ಸ್ಟಾಕ್ ಇಲ್ಲದ SKUಗಳನ್ನು ಮೌನವಾಗಿ ಕೈಬಿಡುವ ಸ್ಟೋರ್‌ಫ್ರಂಟ್ ಹಲವಾರು ಸಮಸ್ಯೆಗಳನ್ನು ಸೃಷ್ಟಿಸುತ್ತದೆ:

  • ಫ್ರಂಟ್-ಎಂಡ್ ಘಟಕಗಳು (components) ಕಾಣದ ಎಂಟ್ರಿಗಳನ್ನು ಪಡೆಯುತ್ತವೆ, ಇದರಿಂದ ಖಾಲಿ ಲೇಬಲ್‌ಗಳು ಅಥವಾ ತಪ್ಪಾದ ಬೆಲೆಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ.
  • ಡಿಬಗ್ ಮಾಡುವುದು ಕಷ್ಟವಾಗುತ್ತದೆ ಏಕೆಂದರೆ ಕಾಣೆಯಾದ ಉತ್ಪನ್ನಗಳು ಎಂಬ ಲಕ್ಷಣವು ಯಾವುದೇ ಎಚ್ಚರಿಕೆಗಳನ್ನು (warnings) ನೀಡುವುದಿಲ್ಲ.

ಹೆಚ್ಚಿನ ಸ್ವಯಂಚಾಲಿತ ಪರೀಕ್ಷೆಗಳು (automated tests) ಸ್ಟಾಕ್ ಇರುವ ಫಿಕ್ಸ್ಚರ್‌ಗಳನ್ನು ಬಳಸುವುದರಿಂದ, ಸೈಟ್ ನೈಜ ಇನ್ವೆಂಟರಿಯೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವವರೆಗೆ ಈ ಬಗ್ ಅಡಗಿಕೊಂಡಿರುತ್ತದೆ.

ಇನ್ವೆಂಟರಿಯನ್ನು ಮರೆಮಾಚದೆ ವೇಗವನ್ನು ಹೇಗೆ ಕಾಪಾಡಿಕೊಳ್ಳುವುದು?

  1. ಡಿಫಾಲ್ಟ್ ಸ್ಟಾಕ್ ಫಿಲ್ಟರ್ ಅನ್ನು ಬಿಟ್ಟುಬಿಡಿ (Skip the default stock filter) – ಲಭ್ಯತೆಯ ಬಗ್ಗೆ ಕಾಳಜಿ ಇಲ್ಲದೆ ನಿಮಗೆ ಪ್ರತಿಯೊಂದು ಉತ್ಪನ್ನವೂ ಬೇಕಿದ್ದಲ್ಲಿ, ಕಲೆಕ್ಷನ್‌ನಿಂದ ಫಿಲ್ಟರ್ ಅನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ತೆಗೆದುಹಾಕಿ. ಪ್ರತಿ ಕ್ವೇರಿಗೂ ಸ್ಟಾಕ್ ಪ್ಲಗಿನ್ ಅನ್ನು ಡಿಸೇಬಲ್ ಮಾಡಲು ಅಥವಾ ಬದಲಾಯಿಸಲು Magento ವಿಧಾನಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ.
  2. ನಿಖರತೆ ಮುಖ್ಯವಾದಾಗ ರೆಪೊಸಿಟರಿಯನ್ನು ಬಳಸಿ – ಉತ್ಪನ್ನವು ಸ್ಟಾಕ್ ಇಲ್ಲದಿದ್ದರೂ ಸಹ, ಕೇಳಲಾದ ಪ್ರತಿಯೊಂದು ಪ್ರಾಡಕ್ಟ್ ಐಡಿ ಅನ್ನು ರೆಪೊಸಿಟರಿ ಹಿಂತಿರುಗಿಸುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ. ಹೆಚ್ಚುವರಿ ಕ್ವೇರಿಗಳನ್ನು ನಿಯಂತ್ರಿಸಲು ಫಲಿತಾಂಶಗಳನ್ನು ಕ್ಯಾಶ್ (cache) ಮಾಡಿ ಅಥವಾ ನಿಮಗೆ ಬೇಕಾದ ಐಡಿಗಳನ್ನು ಮಾತ್ರ ಲೋಡ್ ಮಾಡಿ.
  3. ಸಂಪನ್ಮೂಲ ಮಾದರಿ (resource model) ಅಥವಾ ರ (raw) SQL ಬಳಸಿ – ಅಗತ್ಯವಿರುವ ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳಿಗಾಗಿ ನೇರವಾಗಿ ಪ್ರಾಡಕ್ಟ್ ಟೇಬಲ್ ಅನ್ನು ಕ್ವೇರಿ ಮಾಡಿ. ಇದು ಎಲ್ಲಾ ಕಲೆಕ್ಷನ್ ಪ್ಲಗಿನ್‌ಗಳನ್ನು ಬೈಪಾಸ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಯಾವ ಸಾಲುಗಳನ್ನು ಸೇರಿಸಬೇಕು ಎಂಬುದರ ಮೇಲೆ ನಿಮಗೆ ಸಂಪೂರ್ಣ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುತ್ತದೆ.

ವೇಗ ಮತ್ತು ನಿಖರತೆ (Speed versus correctness)

ಗೊಂದಲಮಯ N+1 ಲೂಪ್ ಅನ್ನು ಒಂದೇ ಕಲೆಕ್ಷನ್ ಕ್ವೇರಿಯೊಂದಿಗೆ ಬದಲಾಯಿಸುವುದು ಸಹಜವೆನಿಸುತ್ತದೆ; ವಿಳಂಬದ ಇಳಿಕೆಯು ಸ್ಪಷ್ಟವಾಗಿ ಕಂಡುಬರುತ್ತದೆ. ಆದರೂ, ತಪ್ಪು ಉತ್ಪನ್ನಗಳ ಗುಂಪನ್ನು ಹಿಂತಿರುಗಿಸುವ ವೇಗದ ಕ್ವೇರಿಯು ದೋಷವೇ ಹೊರತು ಆಪ್ಟಿಮೈಸೇಶನ್ (optimization) ಅಲ್ಲ. ಅಸಂಪೂರ್ಣ ಕ್ಯಾಟಲಾಗ್ ಅನ್ನು ತೋರಿಸುವ ಅಪಾಯದ ವಿರುದ್ಧ ಕೇವಲ ವೇಗವನ್ನು ಡೆವಲಪರ್‌ಗಳು ಅಳೆಯಬೇಕು.

ಮುಂದೆ ಯಾವುದನ್ನು ಗಮನಿಸಬೇಕು?

  • ಕನ್ಫಿಗರೇಶನ್ ಡ್ರಿಫ್ಟ್ (Configuration drift) – ಯಾವುದೇ ಕಸ್ಟಮ್ ಕಲೆಕ್ಷನ್ ಕೋಡ್‌ನ ಉದ್ದೇಶಿತ ನಡವಳಿಕೆಯೊಂದಿಗೆ Display Out of Stock Products ಫ್ಲಾಗ್ ಹೊಂದಿಕೆಯಾಗುತ್ತಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.
  • ಪ್ಲಗಿನ್ ಸೈಡ್ ಎಫೆಕ್ಟ್ಸ್ (Plugin side effects) – ಇತರ ಮಾಡ್ಯೂಲ್‌ಗಳು ಕಲೆಕ್ಷನ್‌ಗಳಿಗೆ ತಮ್ಮದೇ ಆದ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು. ನೀವು ಕ್ವೇರಿ ತಂತ್ರಗಳನ್ನು ಬದಲಾಯಿಸುವಾಗಲೆಲ್ಲಾ ಪ್ಲಗಿನ್ ಸ್ಟ್ಯಾಕ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ.

ಪಾಠ ಸ್ಪಷ್ಟವಾಗಿದೆ: ಕಲೆಕ್ಷನ್ ಮೂಲಕ N+1 ಸಮಸ್ಯೆಯನ್ನು ಸರಿಪಡಿಸುವುದು ಕಲೆಕ್ಷನ್‌ನ ಡಿಫಾಲ್ಟ್ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ಕೂಡ ಪರಿಶೀಲಿಸಿದರೆ ಮಾತ್ರ ಯಶಸ್ವಿಯಾಗುತ್ತದೆ. Magento ನ ಅಂತರ್ಗತ ಸ್ಟಾಕ್ ಫಿಲ್ಟರ್ ಅನ್ನು ನಿರ್ಲಕ್ಷಿಸುವುದು ನಿಮ್ಮ ಕ್ಯಾಟಲಾಗ್ ಅನ್ನು ಮೌನವಾಗಿ ಕತ್ತರಿಸಬಹುದು, ಇದು ಕಾರ್ಯಕ್ಷಮತೆಯ ಲಾಭವನ್ನು ಆದಾಯದ ನಷ್ಟವಾಗಿ ಪರಿವರ್ತಿಸಬಹುದು.