System Design শেখো
শেখো / ট্রেড-অফ

REST vs RPC vs GraphQL

10 মিনিট Module 2 · Trade-offs
এক নজরে
  • REST resource-কেন্দ্রিক: URL দিয়ে জিনিস (user, order) চেনায়, HTTP method দিয়ে কাজ বোঝায়।
  • RPC/gRPC action-কেন্দ্রিক: দূরের একটা function কল করার মতো; দ্রুত ও কম latency, সাধারণত service-to-service-এ।
  • GraphQL একটি query language: client ঠিক যতটুকু field দরকার ততটুকুই চায়, তাই over/under-fetching কমে।

সমস্যাটা কী?

তোমার mobile app আর backend server কথা বলবে। App বলবে "এই user-এর তথ্য দাও", "নতুন order তৈরি করো"। এই কথা বলার নিয়ম-কানুনকেই বলে API design।

কিন্তু API বানানোর একাধিক ধরন আছে, আর প্রতিটার দর্শন আলাদা:

  1. REST — সবকিছুকে "resource" হিসেবে দেখে, URL ও HTTP method দিয়ে কাজ করে।
  2. RPC / gRPC — দূরের server-এ একটা function কল করার মতো করে কাজ করে।
  3. GraphQL — একটা query language, client ঠিক যা চায় তা-ই চেয়ে নেয়।

ভুল বাছাই করলে হয় API ধীর হয়, নয়তো অকারণে জটিল। চলো তিনটে বুঝি।

প্রথমটা: REST

REST (Representational State Transfer)-এর মূল ধারণা: সবকিছু একটা resource, আর প্রতিটা resource-এর একটা URL আছে। কাজ কী হবে তা ঠিক করে HTTP method:

  • GET /users/123 → ১২৩ নম্বর user-কে এনে দাও।
  • POST /users → নতুন user বানাও।
  • PUT /users/123 → আপডেট করো। DELETE /users/123 → মুছে দাও।

সুবিধা:

  • সহজ ও সর্বজনীন। HTTP-র ওপর, browser/মোবাইল/যেকোনো ভাষা সহজে ব্যবহার করে। Public API-র জন্য আদর্শ।
  • পড়তে সহজ, cache করা সহজ, debugging সহজ।

অসুবিধা:

  • Over-fetching ও Under-fetching। Over-fetching = দরকারের চেয়ে বেশি data আসা (শুধু নাম চাই, কিন্তু পুরো user object এল)। Under-fetching = এক call-এ কম পড়ে, তাই একাধিক call দিতে হয় (user, তারপর তার order, তারপর প্রতিটা order-এর item — তিন ধাপ)।
  • জটিল সম্পর্কিত data টানতে অনেকগুলো round-trip লাগে।

দ্বিতীয়টা: RPC / gRPC এবং GraphQL

RPC / gRPC

RPC (Remote Procedure Call)-এর দর্শন: resource নিয়ে না ভেবে সরাসরি একটা action/function কল করো — যেন function-টা তোমার নিজের code-এ আছে, কিন্তু আসলে চলছে দূরের server-এ। যেমন getUser(123) বা createOrder(...)

gRPC হলো Google-এর জনপ্রিয় আধুনিক RPC framework। এটা data পাঠায় compact binary ফরম্যাটে (Protocol Buffers), JSON text-এর চেয়ে অনেক ছোট ও দ্রুত।

  • সুবিধা: খুব দ্রুত, কম latency, কড়া contract (কোন function কী নেয়/দেয় আগে থেকে নির্ধারিত), streaming সমর্থন।
  • অসুবিধা: browser থেকে সরাসরি ব্যবহার করা কঠিন, binary বলে চোখে পড়ে না (debug কম সহজ), শেখার বাড়তি ধাপ।

GraphQL

GraphQL একটা query language। এখানে সাধারণত একটাই endpoint, আর client নিজে বলে দেয় তার ঠিক কোন field দরকার:

{ user(id: 123) { name orders { total } } }

এতে যা চাইবে ঠিক ততটুকুই আসবে — তাই over-fetching নেই; আর এক query-তেই user + তার order একসাথে — তাই under-fetching/বহু round-trip নেই।

  • সুবিধা: client-এর নিয়ন্ত্রণে নমনীয় query, over/under-fetching কমে, এক request-এ সম্পর্কিত data।
  • অসুবিধা: server-এ বানানো ও cache করা জটিল, দুষ্ট query খুব ভারী হতে পারে, ছোট API-র জন্য overkill।
সহজ উদাহরণ: তিন রকম রেস্টুরেন্ট

REST হলো বাঁধা menu-র রেস্টুরেন্ট — "৫ নম্বর সেট" চাইলে পুরো সেট আসে, এমনকি যে আইটেম চাও না সেটাও (over-fetching)। আবার আলাদা সস চাইলে আরেকবার অর্ডার দিতে হয় (under-fetching)।

RPC হলো বাবুর্চিকে সরাসরি নির্দেশ — "এই কাজটা করে দাও" (createOrder)। দ্রুত ও সরাসরি, কিন্তু রান্নাঘরের ভাষা জানতে হয়।

GraphQL হলো বুফে যেখানে তুমি প্লেটে ঠিক যা চাও, যতটুকু চাও তা-ই নাও — এক চক্করে, বাড়তি কিছু না।

পাশাপাশি তুলনা

বিষয়RESTRPC / gRPCGraphQL
দর্শনresource (URL)action (function)query (client চায়)
Data formatসাধারণত JSONbinary (protobuf)JSON
Over/under-fetchingহয়কমপ্রায় নেই
গতি/latencyমাঝারিখুব দ্রুতমাঝারি
Browser-friendlyহ্যাঁকমহ্যাঁ
Cacheসহজকঠিনকঠিন
উপযুক্তpublic API, CRUDinternal service-to-serviceনমনীয় client, mobile

কখন কোনটা বেছে নেবে

  • REST — public API, সাধারণ CRUD, যেখানে সরলতা ও সহজ caching দরকার। সন্দেহ থাকলে এটাই নিরাপদ ডিফল্ট।
  • gRPC — internal microservice-দের নিজেদের মধ্যে কথা, যেখানে গতি ও কম latency সবচেয়ে জরুরি।
  • GraphQL — যখন client (বিশেষত mobile) ভিন্ন ভিন্ন রকম data চায় আর over/under-fetching বড় সমস্যা।
সাবধান

সবচেয়ে সাধারণ ভুল: নতুন বলে সব জায়গায় GraphQL বা gRPC বসিয়ে দেওয়া। সাধারণ একটা CRUD app-এ GraphQL আনলে caching, security ও query-cost সামলাতে গিয়ে অযথা জটিলতা বাড়ে; আবার public browser-facing API-তে gRPC দিলে ভোগান্তি। প্রযুক্তির hype নয়, তোমার client কী চায় ও কোথায় bottleneck — সেটা দিয়ে ঠিক করো।

বাস্তব উদাহরণ

  • Stripe, Twitter, GitHub-এর public API মূলত REST — সহজ, সর্বজনীন, ব্যাপকভাবে ব্যবহৃত (GitHub-এর GraphQL API-ও আছে)।
  • Google ও Netflix internal microservice যোগাযোগে gRPC ব্যবহার করে — হাজার হাজার service-এর মধ্যে দ্রুত call দরকার বলে।
  • Facebook GraphQL তৈরিই করেছিল mobile app-এর জন্য, যাতে ধীর network-এ ঠিক প্রয়োজনীয় data এক request-এ আসে; GitHub-ও এটা public API-তে এনেছে।
টিপস

Interview-তে দেখাও যে তুমি একটার মধ্যে আটকে নেই: "Public-facing CRUD হলে REST নেব সরলতা ও caching-এর জন্য। ভেতরের service-to-service-এ gRPC, কারণ latency ও throughput গুরুত্বপূর্ণ। Client যদি বহু রকম view-এর জন্য বিচিত্র data চায় আর over-fetching বড় সমস্যা হয়, তবে GraphQL।" — এই প্রসঙ্গভিত্তিক উত্তরই পরিণত প্রকৌশলীর ছাপ।

মূল শব্দ (Key Terms)

মিনি কুইজ

1. GraphQL মূলত কোন সমস্যা সমাধান করে?

2. gRPC সাধারণত কোথায় বেশি ব্যবহার হয়?

3. REST-এ একটা নির্দিষ্ট user আনতে সাধারণত কী ব্যবহার হয়?