Apache AGE ನೊಂದಿಗೆ ಗ್ರಾಫ್-ಆಧಾರಿತ ವೀಡಿಯೊ ಸಂಬಂಧಿತ ಪ್ರಶ್ನೆಗಳನ್ನು (queries) ನಿರ್ಮಿಸುವುದು
ನಮ್ಮ ಅತ್ಯಂತ ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸುವ (expensive) ಪ್ರಶ್ನೆಯೆಂದರೆ ಒಂದು ಸರಳವಾದ "ಸಂಬಂಧಿತ ವೀಡಿಯೊಗಳನ್ನು ತೋರಿಸಿ" (show related videos) ಎಂಬ ಪ್ಯಾನಲ್ ಆಗಿತ್ತು.
ViralVidVault ನಲ್ಲಿ, ನಾವು ವೀಡಿಯೊ ಟ್ರೆಂಡ್ಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡುತ್ತೇವೆ. ಹಂಚಿಕೆಯ ಚಾನೆಲ್ಗಳು ಅಥವಾ ಒಟ್ಟಿಗೆ ವೀಕ್ಷಿಸಿದ ಸೆಷನ್ಗಳ (co-viewed sessions) ಮೂಲಕ ಸಂಬಂಧಿತ ವೀಡಿಯೊಗಳನ್ನು ಹುಡುಕುವುದು ನಮ್ಮ ಡೇಟಾಬೇಸ್ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕುಸಿಯುವಂತೆ ಮಾಡುತ್ತದೆ ಎಂದು ನಾವು ಕಂಡುಕೊಂಡೆವು. ನಾವು recursive joins ನೊಂದಿಗೆ SQLite ಅನ್ನು ಬಳಸಲು ಪ್ರಯತ್ನಿಸಿದೆವು. ಇದು ಒಂದು ಹॉप (one hop) ಗೆ ಕೆಲಸ ಮಾಡಿತು. ಆದರೆ ಎರಡು ಹॉपಗಳಲ್ಲಿ, ಡೇಟಾ ಅತಿಯಾಗಿ ವಿಸ್ತರಿಸಿತು (exploded). ಒಂದು ಪ್ರಶ್ನೆಯೇ ಲಕ್ಷಾಂತರ ಸಾಲುಗಳನ್ನು (rows) ಸೃಷ್ಟಿಸಿತು. ನಮ್ಮ ವರ್ಕರ್ಸ್ಗಳು ಟೈಮ್ ಔಟ್ (timing out) ಆಗಲು ಪ್ರಾರಂಭಿಸಿದವು.
ಡೇಟಾ ಒಂದು ಗ್ರಾಫ್ ಆಗಿದೆ. ನಾವು ಅದನ್ನು ಟೇಬಲ್ಗಳಿಗೆ ಅಳವಡಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದೆವು ಮತ್ತು ಅದಕ್ಕಾಗಿ ಹೆಚ್ಚಿನ ಬೆಲೆ ತೆರುತ್ತಿದ್ದೆವು.
ನಾವು ಸಂಬಂಧಿತ ಲೇಯರ್ ಅನ್ನು (relationship layer) Apache AGE ಗೆ ವರ್ಗಾಯಿಸಿದೆವು. ಇದು PostgreSQL ಗಾಗಿ ಒಂದು openCypher extension ಆಗಿದೆ. ನಾವು ನಮ್ಮ PHP 8.4 ಆ್ಯಪ್ ಮತ್ತು SQLite ಸ್ಟೋರ್ ಅನ್ನು ಹಾಗೆಯೇ ಇರಿಸಿಕೊಂಡಿದ್ದೇವೆ.
ಫಲಿತಾಂಶಗಳು: • ಸಂಬಂಧಿತ ಪ್ಯಾನಲ್ನ ವಿಳಂಬತೆ (latency) 900ms ನಿಂದ 40ms ಕ್ಕಿಂತ ಕಡಿಮೆಗೆ ಇಳಿಕೆಯಾಯಿತು. • ಸಂಕೀರ್ಣವಾದ ಎರಡು-ಹॉप ಟ್ರಾವರ್ಸಲ್ಗಳು (two-hop traversals) ಈಗ ಒಂದಂಕೆಯ ಮಿಲಿಸೆಕೆಂಡ್ಗಳಲ್ಲಿ ನಡೆಯುತ್ತವೆ. • AGE, Postgres ಒಳಗಡೆಯೇ ಚಲಿಸುವುದರಿಂದ ನಮ್ಮ ಕಾರ್ಯಾಚರಣೆಯ ಕೆಲಸದ ಹೊರೆ (operational workload) ಮೊದಲಿನಂತೆಯೇ ಇತ್ತು.
ಸ್ವತಂತ್ರ ಗ್ರಾಫ್ ಡೇಟಾಬೇಸ್ಗೆ ಬದಲಾಗಿ Apache AGE ಅನ್ನು ಏಕೆ ಬಳಸಬೇಕು?
ಕಾರ್ಯಾಚರಣೆಯ ಸರಳತೆ (Operational Simplicity) ಬ್ಯಾಕಪ್ ಮಾಡಲು ಅಥವಾ ಸುರಕ್ಷಿತಗೊಳಿಸಲು ನಿಮಗೆ ಹೊಸ ಡೇಟಾಬೇಸ್ ಅಗತ್ಯವಿಲ್ಲ. AGE ನಿಮ್ಮ ಈಗಿರುವ Postgres ಸೆಟಪ್, ಕನೆಕ್ಷನ್ ಪೂಲ್ಗಳು ಮತ್ತು ಸೆಕ್ಯೂರಿಟಿ ರೂಲ್ಸ್ಗಳನ್ನು ಬಳಸುತ್ತದೆ.
ನೇтив ಗ್ರಾಫ್ ಪ್ರಶ್ನೆಗಳು (Native Graph Queries) SQL ನಲ್ಲಿ, variable-length ಪಥಗಳಿಗೆ ಸಂಕೀರ್ಣವಾದ recursion ಅಗತ್ಯವಿರುತ್ತದೆ. Cypher ನಲ್ಲಿ, ನೀವು ಅವುಗಳನ್ನು ಸರಳವಾದ ಪ್ಯಾಟರ್ನ್ಗಳಾಗಿ ಬರೆಯಬಹುದು. 40 ಸಾಲುಗಳ recursive SQL ಬ್ಲಾಕ್ ಈಗ ಕೇವಲ 6 ಸಾಲುಗಳ Cypher ಪ್ರಶ್ನೆಯಾಗಿದೆ.
ಉತ್ತಮ ಕಾರ್ಯಕ್ಷಮತೆ (Better Performance) ಗ್ರಾಫ್ ಇಂಜಿನ್ ಅಡ್ಜಾಸೆನ್ಸಿಯನ್ನು (adjacency) ಇಂಡೆಕ್ಸ್ ಮಾಡುತ್ತದೆ. ಇದು ಹೊಂದಿಕೆಯಾಗದ ಪಥಗಳನ್ನು ವಿಸ್ತರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ. ಇದು ನಮ್ಮ ಹಿಂದಿನ ವ್ಯವಸ್ಥೆಯನ್ನು ಕುಸಿಯುವಂತೆ ಮಾಡಿದ ಡೇಟಾ ಫ್ಯಾನ್-ಔಟ್ (data fan-out) ಅನ್ನು ತಡೆಯುತ್ತದೆ.
ನಮ್ಮ ಮೈಗ್ರೇಷನ್ನಿಂದ ಕಲಿತ ಪ್ರಮುಖ ಪಾಠ: ಯಾವಾಗಲೂ ನಿಮ್ಮ ಎಂಟ್ರಿಪಾಯಿಂಟ್ ಪ್ರಾಪರ್ಟಿಗಳನ್ನು (entrypoint properties) ಇಂಡೆಕ್ಸ್ ಮಾಡಿ. ನೀವು ಟ್ರಾವರ್ಸಲ್ ಪ್ರಾರಂಭಿಸಲು ಬಳಸುವ ID ಅನ್ನು ಇಂಡೆಕ್ಸ್ ಮಾಡದಿದ್ದರೆ, AGE ಪೂರ್ಣ ಸ್ಕ್ಯಾನ್ (full scan) ಮಾಡುತ್ತದೆ. ಇದು ಅತ್ಯುತ್ತಮ ಗ್ರಾಫ್ ಪ್ರಶ್ನೆಯನ್ನೂ ನಿಧಾನಗೊಳಿಸುತ್ತದೆ.
ನಾವು ಗ್ರಾಫ್ ಅನ್ನು ರೀಡ್ ಮಾಡೆಲ್ (read model) ಆಗಿ ಬಳಸುತ್ತೇವೆ. ನಮ್ಮ ರಾಗ ಡೇಟಾ (raw data) SQLite ನಲ್ಲಿ ಇರುತ್ತದೆ. ಎರಡನ್ನೂ ಸಿಂಕ್ ಮಾಡಲು ನಾವು Python ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಬಳಸುತ್ತೇವೆ. ಇದು ನಮ್ಮ ಗ್ರಾಫ್ ಅನ್ನು ವೇಗವಾಗಿ, ಲೈಟ್ವೇಟ್ ಆಗಿ ಮತ್ತು ಸುಲಭವಾಗಿ ಮರುನಿರ್ಮಿಸುವಂತೆ (rebuild) ಇರಿಸುತ್ತದೆ.
ನಿಮ್ಮ recursive SQL ಪ್ರಶ್ನೆಗಳು ಅತಿಯಾಗಿ ಸಂಕೀರ್ಣವಾಗುತ್ತಿದ್ದರೆ, ರಿಲೇಶನಲ್ ಮಾಡೆಲ್ನೊಂದಿಗೆ ಹೋರಾಡಬೇಡಿ. ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಸ್ಟೋರ್ನ ಜೊತೆಗೆ ಒಂದು ಸಣ್ಣ ಗ್ರಾಫ್ ಪ್ರೊಜೆಕ್ಷನ್ ಅನ್ನು ನಿರ್ಮಿಸಿ.
