GraphQL ও gRPC — Modern API

লেসন ২১ / ৫০

REST সীমাবদ্ধতা

  • Over-fetching, under-fetching
  • Multi round trip
  • Versioning কষ্টকর

GraphQL ⭐

Facebook (2015) — single endpoint, client decides কী data।

Schema

type User {
  id: ID!
  name: String!
  posts: [Post!]!
}

type Query { user(id: ID!): User }
type Mutation { createUser(name: String!): User! }
type Subscription { userCreated: User! }

Query

query {
  user(id: "1") {
    name
    posts(limit: 5) { title }
  }
}

Resolvers

const resolvers = {
  Query: {
    user: (_, {id}) => db.users.findById(id)
  },
  User: {
    posts: (parent) => db.posts.findByUserId(parent.id)
  }
};

N+1 Problem ⭐

// 100 users → 1 query
// Each user posts → 100 queries (101 total!)

✅ DataLoader (batching)
const userLoader = new DataLoader(ids => db.users.findByIds(ids));
posts: (parent) => userLoader.load(parent.userId);
// Auto-batch within tick → 2 queries

GraphQL সুবিধা

  • No over/under fetching
  • Single endpoint, strongly typed
  • Real-time (subscription)

অসুবিধা

  • Caching কঠিন (HTTP cache না)
  • Query complexity attack
  • File upload tricky

gRPC ⭐

Google — HTTP/2, binary, very fast। Service-to-service ideal।

Protocol Buffers

syntax = "proto3";

service UserService {
  rpc GetUser (UserRequest) returns (UserResponse);
  rpc StreamUsers (UsersRequest) returns (stream UserResponse);
}

message UserRequest { int32 id = 1; }
message UserResponse {
  int32 id = 1;
  string name = 2;
}

4 gRPC Types

  • Unary — req → res
  • Server streaming
  • Client streaming
  • Bidirectional

gRPC সুবিধা

  • Binary 5-10x faster than JSON
  • HTTP/2 multiplexing
  • Strongly typed
  • Code-gen multi-language

কোনটি কখন?

NeedChoice
Public APIREST
Mobile, varied dataGraphQL
Microservice internalgRPC
Real-time bidigRPC/WebSocket