GraphQL Video Discovery API ಅನ್ನು ನಿರ್ಮಿಸುವುದು
ನಮ್ಮ ವಿಡಿಯೋ ಡೇಟಾಬೇಸ್ ಲಕ್ಷಾಂತರ ದಾಖಲೆಗಳಿಗೆ ಬೆಳೆದಾಗ, ನಮ್ಮ API bottleneckವಾಯಿತು.
ಟ್ರೆಂಡಿಂಗ್ ವಿಡಿಯೋಗಳು, ಚಾನೆಲ್ ವಿವರಗಳು, ಟ್ಯಾಗ್ಗಳು, ವೀಕ್ಷಣೆಗಳ ಸಂಖ್ಯೆ ಮತ್ತು ಶಿಫಾರಸುಗಳನ್ನು (recommendations) ತೋರಿಸಲು ಒಂದೇ ಸ್ಕ್ರೀನ್ಗೆ ಐದು ವಿಭಿನ್ನ REST ಕರೆಗಳ ಅಗತ್ಯವಿತ್ತು. ನಿಧಾನಗತಿಯ ಇಂಟರ್ನೆಟ್ ಬಳಸುವ ಮೊಬೈಲ್ ಬಳಕೆದಾರರು ಕೇವಲ ಒಂದು ಪುಟವನ್ನು ಲೋಡ್ ಮಾಡಲು 30 ವಿನಂತಿಗಳನ್ನು (requests) ಕಳುಹಿಸಬೇಕಾಗುತ್ತಿತ್ತು.
GraphQL ಇದನ್ನು ಪರಿಹರಿಸುತ್ತದೆ. ಕ್ಲೈಂಟ್ ತನ್ನ ಅಗತ್ಯವಿರುವ ಮಾಹಿತಿಯನ್ನು ಕೇವಲ ಒಂದು ವಿನಂತಿಯಲ್ಲಿ ಪಡೆಯಬಹುದು.
ನಾನು Strawberry ಮತ್ತು FastAPI ಬಳಸಿ ಪ್ರೊಡಕ್ಷನ್ ವಿಡಿಯೋ ಡಿಸ್ಕವರಿ API ಅನ್ನು ನಿರ್ಮಿಸಿದ್ದೇನೆ. ನಾನು ಅದನ್ನು ಹೇಗೆ ಮಾಡಿದೆ ಎಂಬ ವಿವರ ಇಲ್ಲಿದೆ.
ಯಾಕೆ Strawberry?
ನಾನು Graphene ಮತ್ತು Ariadne ಅನ್ನು ಪರೀಕ್ಷಿಸಿದೆ, ಆದರೆ ಈ ಕಾರಣಗಳಿಗಾಗಿ Strawberry ಗೆ ಆದ್ಯತೆ ನೀಡಿದೆ:
• Type hints ಗಳು ಸ್ಕೀಮಾವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ: ನೀವು Python ಕೋಡ್ ಬರೆಯುತ್ತೀರಿ ಮತ್ತು Strawberry GraphQL ಪ್ರಕಾರಗಳನ್ನು (types) ನಿರ್ಮಿಸುತ್ತದೆ. ಯಾವುದೇ ಮ್ಯಾನುಯಲ್ ಸಿಂಕ್ರೊನೈಸೇಶನ್ ಅಗತ್ಯವಿಲ್ಲ. • ಇದು async-native ಆಗಿದೆ: ಇದು ಇವೆಂಟ್ ಲೂಪ್ ಅನ್ನು ಬ್ಲಾಕ್ ಮಾಡದೆಯೇ ಅನೇಕ ವಿನಂತಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು API ಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. • FastAPI ಇಂಟಿಗ್ರೇಷನ್ ಸುಗಮವಾಗಿದೆ: GraphQL ಎಂಡ್ಪಾಯಿಂಟ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ REST ರೂಟ್ಗಳ ಪಕ್ಕದಲ್ಲೇ ಇರುತ್ತದೆ. • ಬಿಲ್ಟ್-ಇನ್ DataLoader: ಈ ಸಾಧನವು N+1 ಸಮಸ್ಯೆಯನ್ನು ತಕ್ಷಣವೇ ಪರಿಹರಿಸುತ್ತದೆ.
ಡೇಟಾ ಸ್ಟ್ಯಾಕ್ (The Data Stack)
ಡೇಟಾವು PHP ಸೈಟ್ನಿಂದ ನಿರ್ವಹಿಸಲ್ಪಡುವ SQLite ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ಇರುತ್ತದೆ. ವೇಗದ ಫುಲ್-ಟೆಕ್ಸ್ಟ್ ಸರ್ಚ್ (full-text search) ಗಾಗಿ ನಾನು SQLite FTS5 ಅನ್ನು ಬಳಸುತ್ತೇನೆ.
Python ಸರ್ವಿಸ್ ಈ ಡೇಟಾಬೇಸ್ ಅನ್ನು ರೀಡ್-ಓನ್ಲಿ (read-only) ಲೇಯರ್ ಆಗಿ ಓದುತ್ತದೆ. ಇದು ಕೇವಲ ಒಂದು ಅಧಿಕೃತ ಮೂಲ (source of truth) ಇರುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ಸರ್ಚ್ ಅನುಭವ ಉತ್ತಮವಾಗಿರಲು, ನಾನು FTS5 ರೆಲೆವೆನ್ಸ್ ಸ್ಕೋರ್ಗಳನ್ನು ಪಾಪ್ಯುಲಾರಿಟಿ ಸಿಗ್ನಲ್ನೊಂದಿಗೆ ಬೆರೆಸುತ್ತೇನೆ. ಇದು ಕೇವಲ ಒಂದು ವೈರಲ್ ವಿಡಿಯೋ ಇತರ ಎಲ್ಲಾ ಸರ್ಚ್ ಫಲಿತಾಂಶಗಳನ್ನು ಮರೆಮಾಚದಂತೆ ತಡೆಯುತ್ತದೆ.
N+1 ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸುವುದು
GraphQL ನಲ್ಲಿ ಸಾಮಾನ್ಯವಾದ ತೊಂದರೆ ಎಂದರೆ N+1 ಸಮಸ್ಯೆ. ನೀವು 20 ವಿಡಿಯೋಗಳನ್ನು ಪಡೆದು, ನಂತರ ಪ್ರತಿಯೊಂದಕ್ಕೂ ಚಾನೆಲ್ ವಿವರವನ್ನು ಪಡೆದರೆ, ಸಾಮಾನ್ಯ API 21 ಡೇಟಾಬೇಸ್ ಕ್ವೇರಿಗಳನ್ನು ಚಲಾಯಿಸುತ್ತದೆ.
DataLoader ಇದನ್ನು ಬ್ಯಾಚಿಂಗ್ (batching) ಮೂಲಕ ಸರಿಪಡಿಸುತ್ತದೆ. ಇದು ಎಲ್ಲಾ ಚಾನೆಲ್ IDಗಳನ್ನು ಒಂದೇ ಬಾರಿಗೆ ಸಂಗ್ರಹಿಸುತ್ತದೆ ಮತ್ತು ಅವುಗಳನ್ನು ಪಡೆಯಲು ಒಂದೇ ಕ್ವೇರಿಯನ್ನು ಚಲಾಯಿಸುತ್ತದೆ. ಇದು ನಮ್ಮ ಕ್ವೇರಿ ಸಮಯವನ್ನು 40ms ನಿಂದ 5ms ಕ್ಕಿಂತ ಕಡಿಮೆ ಮಾಡಿದೆ.
ಪ್ರಮುಖ ವಿನ್ಯಾಸದ ಆಯ್ಕೆಗಳು
• Opaque IDs: ನಾನು IDಗಳಿಗಾಗಿ ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು ಬಳಸುತ್ತೇನೆ. ಇದು ಕ್ಲೈಂಟ್ ಆಪ್ಗಳನ್ನು ಹಾಳು ಮಾಡದೆಯೇ ಭವಿಷ್ಯದ ಬದಲಾವಣೆಗಳಿಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. • Intentional Nullability: ಯಾವ ಫೀಲ್ಡ್ಗಳು ಖಾಲಿ ಇರಬಹುದು ಎಂಬುದನ್ನು ನಾನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತೇನೆ. ಇದು ಡೇಟಾ ಇಲ್ಲದಿದ್ದಾಗ ಕ್ಲೈಂಟ್ಗಳು ಕ್ರ್ಯಾಶ್ ಆಗದಂತೆ ನಿರ್ವಹಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ. • Read-only Schema: GraphQL API ಬರವಣಿಗೆಯನ್ನು (writes) ನಿರ್ವಹಿಸುವುದಿಲ್ಲ. ಇದು ಅನೇಕ ಭದ್ರತಾ ತಲೆನೋವುಗಳನ್ನು ನಿವಾರಿಸುತ್ತದೆ. • Edge Caching: GraphQL ಡಿಫಾಲ್ಟ್ ಆಗಿ POST ಅನ್ನು ಬಳಸುತ್ತದೆ, ಇದನ್ನು ಕ್ಯಾಶ್ ಮಾಡುವುದು ಕಷ್ಟ. Cloudflare ಮೂಲಕ ಕ್ಯಾಶಿಂಗ್ ಮಾಡಲು ನಾನು Automatic Persisted Queries (APQ) ಅನ್ನು ಬಳಸುತ್ತೇನೆ.
ನೀವು ಅತಿಯಾದ ಕಸ್ಟಮ್ ಎಂಡ್ಪಾಯಿಂಟ್ಗಳು ಅಥವಾ ಸಂಕೀರ್ಣ ಕ್ವೇರಿ ಪ್ಯಾರಾಮೀಟರ್ಗಳೊಂದಿಗೆ ಕಷ್ಟಪಡುತ್ತಿದ್ದರೆ, ಈ ಸ್ಟ್ಯಾಕ್ ಒಂದು ಉತ್ತಮ ಆಯ್ಕೆಯಾಗಿದೆ.
