בניית GraphQL Video Discovery API

כשמאגר הנתונים של הסרטונים שלנו צמח למאות אלפי רשומות, ה-API שלנו הפך לצוואר הבקבוק.

מסך בודד נזקק לחמש קריאות REST שונות כדי להציג סרטונים טרנדיים, פרטי ערוץ, תגיות, מספר צפיות והמלצות. משתמשי מובייל בחיבורים איטיים נאלצו לשלוח 30 בקשות רק כדי לטעון דף אחד.

GraphQL פותר את זה. הלקוח מבקש בדיוק את מה שהוא צריך בבקשה אחת.

בניתי API לייצור (production) לגילוי סרטונים באמצעות Strawberry ו-FastAPI. הנה איך עשיתי זאת.

למה Strawberry?

בדקתי את Graphene ואת Ariadne, אבל Strawberry ניצח מהסיבות הבאות:

• Type hints הם הסכימה (schema). אתם כותבים קוד Python, ו-Strawberry בונה את סוגי ה-GraphQL. אין צורך בסנכרון ידני. • הוא native ל-async. זה מאפשר ל-API לטפל בהרבה בקשות מבלי לחסום את ה-event loop. • האינטגרציה עם FastAPI היא חלקה. ה-GraphQL endpoint נמצא ממש לצד נתיבי ה-REST הקיימים. • DataLoader מובנה. הכלי הזה פותר את בעיית ה-N+1 "מהקופסה".

ערימת הנתונים (The Data Stack)

הנתונים נמצאים במסד נתונים SQLite המנוהל על ידי אתר PHP. אני משתמש ב-SQLite FTS5 לחיפוש טקסט מלא (full-text search) מהיר.

שירות ה-Python קורא את מסד הנתונים הזה כשכבת קריאה בלבד (read-only). זה מבטיח שיש רק מקור אמת אחד (source of truth).

כדי שהחיפוש ירגיש טוב, אני משלב בין ציוני הרלוונטיות של FTS5 לבין אות פופולריות. זה מונע מסרטון ויראלי בודד להטביע את כל שאר תוצאות החיפוש.

פתרון בעיית ה-N+1

מלכודת נפוצה ב-GraphQL היא בעיית ה-N+1. אם אתם שולפים 20 סרטונים ואז שולפים את הערוץ עבור כל אחד מהם, API פשוט יריץ 21 שאילתות למסד הנתונים.

DataLoader פותר זאת באמצעות batching. הוא אוסף את כל מזהי הערוצים ב"טיק" אחד ומריץ שאילתה אחת כדי לשלוף את כולם. זה הפחית את זמן השאילתה שלנו מ-40ms לפחות מ-5ms.

בחירות עיצוב מרכזיות

• מזהים אטומיים (Opaque IDs): אני משתמש במחרוזות (strings) עבור מזהים. זה מאפשר שינויים עתידיים מבלי לשבור אפליקציות לקוח. • Nullability מכוונת: אני מגדיר אילו שדות יכולים להיות ריקים. זה עוזר ללקוחות לטפל בנתונים חסרים מבלי לקרוס. • סכימה לקריאה בלבד (Read-only Schema): ה-GraphQL API אינו מטפל בכתיבות. זה מסיר הרבה כאבי ראש של אבטחה. • Edge Caching: GraphQL משתמש ב-POST כברירת מחדל, מה שמקשה על caching. אני משתמש ב-Automatic Persisted Queries (APQ) כדי לאפשר caching דרך Cloudflare.

אם אתם מתמודדים עם יותר מדי endpoints מותאמים אישית או פרמטרי שאילתה מורכבים, ערימה זו היא אופציה חזקה.

מקור: https://dev.to/ahmet_gedik778845/building-a-graphql-video-discovery-api-with-strawberry-and-fastapi-1dp2