GraphQL Video Discovery API બનાવવું

જ્યારે અમારો વિડિયો ડેટાબેઝ લાખો રેકોર્ડ્સ સુધી પહોંચ્યો, ત્યારે અમારું API અવરોધ (bottleneck) બની ગયું.

ટ્રેન્ડિંગ વિડિયો, ચેનલની વિગતો, ટેગ્સ, વ્યુ કાઉન્ટ્સ અને ભલામણો (recommendations) બતાવવા માટે એક જ સ્ક્રીન પર પાંચ અલગ-અલગ REST કોલ્સની જરૂર પડતી હતી. ધીમા કનેક્શન પર રહેલા મોબાઈલ યુઝર્સને માત્ર એક પેજ લોડ કરવા માટે 30 રિક્વેસ્ટ મોકલવી પડતી હતી.

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)

ડેટા એક SQLite ડેટાબેઝમાં રહેલો છે જે PHP સાઇટ દ્વારા મેનેજ કરવામાં આવે છે. ઝડપી ફૂલ-ટેક્સ્ટ સર્ચ માટે હું SQLite FTS5 નો ઉપયોગ કરું છું.

Python સર્વિસ આ ડેટાબેઝને રીડ-ઓન્લી લેયર તરીકે વાંચે છે. આ સુનિશ્ચિત કરે છે કે સત્યનો માત્ર એક જ સ્ત્રોત (source of truth) હોય.

સર્ચનો અનુભવ સારો બનાવવા માટે, હું FTS5 રિલેવન્સ સ્કોર્સને પોપ્યુલારિટી સિગ્નલ સાથે મિક્સ કરું છું. આનાથી કોઈ એક વાયરલ વિડિયો અન્ય તમામ સર્ચ પરિણામોને દબાવી ન દે તે સુનિશ્ચિત થાય છે.

N+1 સમસ્યાનું સમાધાન

GraphQL માં એક સામાન્ય સમસ્યા N+1 પ્રોબ્લેમ છે. જો તમે 20 વિડિયો ફેચ કરો છો અને પછી દરેક માટે ચેનલ ફેચ કરો છો, તો એક સામાન્ય API 21 ડેટાબેઝ ક્વેરી ચલાવશે.

DataLoader બેચિંગ દ્વારા આને ઠીક કરે છે. તે એક જ વખતમાં તમામ ચેનલ ID એકત્રિત કરે છે અને તે બધાને ફેચ કરવા માટે એક જ ક્વેરી ચલાવે છે. આનાથી અમારો ક્વેરી સમય 40ms થી ઘટીને 5ms થી પણ ઓછો થઈ ગયો.

મુખ્ય ડિઝાઇન પસંદગીઓ

• Opaque IDs: હું ID માટે સ્ટ્રિંગ્સનો ઉપયોગ કરું છું. આ ક્લાયન્ટ એપ્સને તોડ્યા વિના ભવિષ્યના ફેરફારોની મંજૂરી આપે છે. • Intentional Nullability: કયા ફીલ્ડ્સ ખાલી હોઈ શકે છે તે હું વ્યાખ્યાયિત કરું છું. આ ક્લાયન્ટ્સને ક્રેશ થયા વિના ખૂટતા ડેટાને હેન્ડલ કરવામાં મદદ કરે છે. • Read-only Schema: GraphQL API રાઈટ્સ (writes) હેન્ડલ કરતું નથી. આનાથી સુરક્ષા સંબંધિત ઘણી સમસ્યાઓ દૂર થાય છે. • Edge Caching: GraphQL ડિફોલ્ટ રીતે POST નો ઉપયોગ કરે છે, જેને કેશ (cache) કરવું મુશ્કેલ છે. હું Cloudflare દ્વારા કેશિંગની મંજૂરી આપવા માટે Automatic Persisted Queries (APQ) નો ઉપયોગ કરું છું.

જો તમે ઘણા બધા કસ્ટમ એન્ડપોઇન્ટ્સ અથવા જટિલ ક્વેરી પેરામીટર્સ સાથે સંઘર્ષ કરી રહ્યા હોવ, તો આ સ્ટેક એક મજબૂત વિકલ્પ છે.

સ્ત્રોત: https://dev.to/ahmet_gedik778845/building-a-graphql-video-discovery-api-with-strawberry-and-fastapi-1dp2