একটি GraphQL ভিডিও ডিসকভারি API তৈরি করা

যখন আমাদের ভিডিও ডাটাবেস লক্ষ লক্ষ রেকর্ডে পৌঁছে গেল, তখন আমাদের API একটি বাধা (bottleneck) হয়ে দাঁড়াল।

একটি মাত্র স্ক্রিনে ট্রেন্ডিং ভিডিও, চ্যানেলের বিবরণ, ট্যাগ, ভিউ কাউন্ট এবং রিকমেন্ডেশন দেখানোর জন্য পাঁচটি আলাদা REST কল প্রয়োজন হতো। ধীরগতির কানেকশন ব্যবহারকারী মোবাইল ইউজারদের একটি পেজ লোড করার জন্যই ৩০টি রিকোয়েস্ট পাঠাতে হতো।

GraphQL এই সমস্যার সমাধান করে। ক্লায়েন্ট একটি মাত্র রিকোয়েস্টের মাধ্যমে ঠিক যা প্রয়োজন তা-ই চাইতে পারে।

আমি Strawberry এবং FastAPI ব্যবহার করে একটি প্রোডাকশন-গ্রেড ভিডিও ডিসকভারি API তৈরি করেছি। আমি এটি কীভাবে করেছি তা নিচে দেওয়া হলো।

কেন Strawberry?

আমি Graphene এবং Ariadne পরীক্ষা করেছি, কিন্তু নিচের কারণগুলোর জন্য Strawberry জয়ী হয়েছে:

• Type hints-ই হলো স্কিমা। আপনি Python কোড লিখবেন এবং Strawberry GraphQL টাইপগুলো তৈরি করে দেবে। কোনো ম্যানুয়াল সিঙ্ক্রোনাইজেশনের প্রয়োজন নেই। • এটি async-native। এটি ইভেন্ট লুপ ব্লক না করেই API-কে অনেক রিকোয়েস্ট হ্যান্ডেল করতে সাহায্য করে। • FastAPI ইন্টিগ্রেশন অত্যন্ত সহজ। GraphQL এন্ডপয়েন্টটি বিদ্যমান REST রুটগুলোর পাশেই থাকে। • বিল্ট-ইন DataLoader। এই টুলটি সরাসরি N+1 সমস্যার সমাধান করে দেয়।

ডাটা স্ট্যাক

ডাটাগুলো একটি PHP সাইট দ্বারা পরিচালিত SQLite ডাটাবেসে থাকে। দ্রুত ফুল-টেক্সট সার্চের জন্য আমি SQLite FTS5 ব্যবহার করি।

Python সার্ভিসটি এই ডাটাবেসটিকে একটি read-only লেয়ার হিসেবে পড়ে। এটি নিশ্চিত করে যে তথ্যের একমাত্র উৎস (source of truth) একটিই আছে।

সার্চ অভিজ্ঞতা উন্নত করতে, আমি FTS5 রেলিভেন্স স্কোরকে পপুলারিটি সিগন্যালের সাথে মিশ্রিত করি। এটি একটি মাত্র ভাইরাল ভিডিওর কারণে অন্যান্য সার্চ রেজাল্ট হারিয়ে যাওয়া রোধ করে।

N+1 সমস্যার সমাধান

GraphQL-এর একটি সাধারণ সমস্যা হলো N+1 problem। আপনি যদি ২০টি ভিডিও ফেচ করেন এবং তারপর প্রতিটি ভিডিওর জন্য চ্যানেল ফেচ করেন, তবে একটি সাধারণ API ২১টি ডাটাবেস কুয়েরি চালাবে।

DataLoader ব্যাচিংয়ের মাধ্যমে এটি সমাধান করে। এটি একবারে সব চ্যানেল আইডি সংগ্রহ করে এবং সেগুলো ফেচ করার জন্য একটি মাত্র কুয়েরি চালায়। এর ফলে আমাদের কুয়েরি টাইম ৪০ms থেকে কমে ৫ms-এর নিচে নেমে এসেছে।

মূল ডিজাইনের সিদ্ধান্তসমূহ

• Opaque IDs: আমি ID-র জন্য স্ট্রিং ব্যবহার করি। এটি ক্লায়েন্ট অ্যাপ ভেঙে না ফেলে ভবিষ্যতে পরিবর্তন করার সুযোগ দেয়। • Intentional Nullability: কোন ফিল্ডগুলো খালি থাকতে পারে তা আমি নির্ধারণ করে দিই। এটি ক্লায়েন্টদের ক্র্যাশ না করে মিসিং ডাটা হ্যান্ডেল করতে সাহায্য করে। • Read-only Schema: GraphQL API কোনো রাইট (write) অপারেশন হ্যান্ডেল করে না। এটি অনেক নিরাপত্তা সংক্রান্ত জটিলতা দূর করে। • Edge Caching: GraphQL ডিফল্টভাবে POST ব্যবহার করে, যা ক্যাশ করা কঠিন। আমি Cloudflare-এর মাধ্যমে ক্যাশিং করার জন্য Automatic Persisted Queries (APQ) ব্যবহার করি।

আপনি যদি অতিরিক্ত কাস্টম এন্ডপয়েন্ট বা জটিল কুয়েরি প্যারামিটার নিয়ে সমস্যায় পড়েন, তবে এই স্ট্যাকটি একটি চমৎকার বিকল্প হতে পারে।

উৎস: https://dev.to/ahmet_gedik778845/building-a-graphql-video-discovery-api-with-strawberry-and-fastapi-1dp2