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
কোনটি কখন?
| Need | Choice |
|---|---|
| Public API | REST |
| Mobile, varied data | GraphQL |
| Microservice internal | gRPC |
| Real-time bidi | gRPC/WebSocket |