গ্রাফকিউএল (GraphQL) এর Subscription ফিচার রিয়েল-টাইম ডেটা ফ্লো পরিচালনার জন্য অত্যন্ত কার্যকরী। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে একধরনের লং লাইভ কানেকশন প্রতিষ্ঠা করে, যার মাধ্যমে সার্ভার কোনো ডেটার পরিবর্তন হলে তা ক্লায়েন্টকে রিয়েল-টাইমে পাঠিয়ে দেয়। এই ফিচারটি বিশেষত চ্যাট অ্যাপ্লিকেশন, লাইভ ডেটা ট্র্যাকিং, নোটিফিকেশন সিস্টেম বা অন্যান্য রিয়েল-টাইম ইন্টারঅ্যাকটিভ সিস্টেমে ব্যবহৃত হয়।
GraphQL Subscription এর মাধ্যমে Real-time Data Flow কীভাবে কাজ করে?
Subscription মূলত একটি GraphQL অপারেশন যা ক্লায়েন্টকে একটি সার্ভারের ইভেন্টের জন্য সাবস্ক্রাইব করতে দেয়। একবার সাবস্ক্রাইব করার পর, সার্ভার যখনই সেই ইভেন্টে কোনো পরিবর্তন ঘটায় (যেমন, নতুন মেসেজ আসা, স্ট্যাটাস আপডেট), তখন সার্ভার সেই পরিবর্তন বা ইভেন্ট ক্লায়েন্টকে পাঠায়। এর মাধ্যমে ক্লায়েন্টরা রিয়েল-টাইমে আপডেট পেতে পারে।
GraphQL Subscription এর মূল উপাদান
- Subscription Query:
ক্লায়েন্ট একটি সাবস্ক্রিপশন কুয়েরি তৈরি করে, যা একটি নির্দিষ্ট ডেটার পরিবর্তন বা ইভেন্ট ট্র্যাক করতে সাহায্য করে। - Server-Side Subscription Handler:
সার্ভারে Subscription সেটআপ করা হয়, যা ডেটা পরিবর্তনের সময় ক্লায়েন্টকে আপডেট পাঠাবে। - WebSocket or HTTP/2:
Subscription সাধারণত WebSocket বা HTTP/2 কানেকশন ব্যবহার করে বাস্তবায়িত হয়, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে স্থায়ী কানেকশন বজায় রাখে।
GraphQL Subscription এর কাজের ধরন
- ক্লায়েন্ট Subscription Request পাঠায়:
প্রথমে ক্লায়েন্ট সার্ভারে একটি subscription কুয়েরি পাঠায়। - WebSocket বা HTTP/2 কানেকশন:
সার্ভার কুয়েরি গ্রহণ করার পর, একটি স্থায়ী কানেকশন তৈরি হয় (যেমন WebSocket)। সার্ভার তার উপর পর্যবেক্ষণ রাখে এবং কোনো ডেটা পরিবর্তন হলে, তা ক্লায়েন্টে পাঠানো হয়। - ডেটা পরিবর্তন হলে রিয়েল-টাইম আপডেট:
যখনই কোনো পরিবর্তন ঘটে (যেমন, একটি নতুন মেসেজ আসা), সার্ভার ক্লায়েন্টকে সঠিক ডেটা পাঠায়। - ক্লায়েন্ট রেসপন্স গ্রহণ করে:
ক্লায়েন্ট সার্ভার থেকে রিয়েল-টাইম ডেটা গ্রহণ করে এবং UI আপডেট হয়।
GraphQL Subscription এর উদাহরণ
ধরা যাক, আপনি একটি চ্যাট অ্যাপ্লিকেশন তৈরি করছেন এবং আপনি চান, নতুন মেসেজ আসলে তা রিয়েল-টাইমে ক্লায়েন্টে পৌঁছাক।
ধাপ ১: Subscription Query লিখুন
subscription {
messageAdded {
id
content
user {
name
}
}
}
এখানে:
messageAddedহল একটি subscription যা নতুন মেসেজ আসলে রিয়েল-টাইমে ক্লায়েন্টে পাঠানো হবে।id,content,userহল মেসেজের প্রাসঙ্গিক ফিল্ড যা আপনি দেখতে চান।
ধাপ ২: Server-Side Subscription Handler
আপনার সার্ভারে subscription সেটআপ করতে হবে। ধরুন আপনি Apollo Server ব্যবহার করছেন:
const { ApolloServer, gql, PubSub } = require('apollo-server');
const pubsub = new PubSub();
// GraphQL Schema
const typeDefs = gql`
type User {
name: String
}
type Message {
id: ID
content: String
user: User
}
type Subscription {
messageAdded: Message
}
type Mutation {
addMessage(content: String, userId: ID!): Message
}
type Query {
messages: [Message]
}
`;
// Resolver Functions
const resolvers = {
Query: {
messages: () => {
return [{ id: 1, content: "Hello World", user: { name: "John" } }];
}
},
Mutation: {
addMessage: (_, { content, userId }) => {
const newMessage = {
id: Math.floor(Math.random() * 1000),
content,
user: { name: "User" }
};
// Publish the message to subscribers
pubsub.publish('MESSAGE_ADDED', { messageAdded: newMessage });
return newMessage;
}
},
Subscription: {
messageAdded: {
subscribe: () => pubsub.asyncIterator('MESSAGE_ADDED')
}
}
};
// Apollo Server Setup
const server = new ApolloServer({
typeDefs,
resolvers
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে:
PubSubব্যবহার করা হয়েছে যেটি রিয়েল-টাইম ডেটার জন্য সাবস্ক্রাইবারদের কাছে ডেটা পুশ করতে সাহায্য করে।messageAddedহল আমাদের subscription, যা সার্ভার থেকে মেসেজ আপডেট হওয়ার সাথে সাথে ক্লায়েন্টে পৌঁছাবে।
ধাপ ৩: Mutation এর মাধ্যমে ডেটা পরিবর্তন করা
ক্লায়েন্ট একটি নতুন মেসেজ পাঠানোর জন্য Mutation ব্যবহার করবে:
mutation {
addMessage(content: "New message!", userId: "1") {
id
content
}
}
addMessageহল Mutation যা একটি নতুন মেসেজ তৈরি করবে এবং তা সার্ভারের মাধ্যমে subscription কে পুশ করবে।
ধাপ ৪: Client-Side Subscription Implementation
এখন, ক্লায়েন্টে GraphQL subscription কিভাবে কাজ করবে তা দেখুন। ক্লায়েন্টে Apollo Client ব্যবহার করে সাবস্ক্রিপশন করা যেতে পারে:
import { ApolloClient, InMemoryCache, gql, ApolloProvider } from '@apollo/client';
const client = new ApolloClient({
uri: 'http://localhost:4000',
cache: new InMemoryCache()
});
const MESSAGE_ADDED = gql`
subscription {
messageAdded {
id
content
user {
name
}
}
}
`;
client.subscribe({ query: MESSAGE_ADDED }).subscribe({
next(data) {
console.log("New message added:", data.data.messageAdded);
}
});
এখানে:
subscribeক্লায়েন্টের জন্য messageAdded subscription কুয়েরি পাঠাবে এবং যখনই নতুন মেসেজ আসবে, তা ক্লায়েন্টে রিয়েল-টাইমে পৌঁছাবে।
GraphQL Subscription এর সুবিধা
- Real-time Updates:
Subscription এর মাধ্যমে, সার্ভার কোনো পরিবর্তন ঘটলেই ক্লায়েন্টকে তাৎক্ষণিকভাবে আপডেট পাঠায়, যা রিয়েল-টাইম ইন্টারঅ্যাকটিভ অ্যাপ্লিকেশন তৈরি করতে সহায়ক। - Efficient Communication:
WebSocket বা HTTP/2 এর মাধ্যমে স্থায়ী কানেকশন বজায় থাকে, তাই বারবার সার্ভারে রিকোয়েস্ট পাঠানোর প্রয়োজন হয় না। এটি নেটওয়ার্ক ট্রাফিক কমাতে সাহায্য করে। - Push Notifications:
Subscription ব্যবহার করে আপনাকে পুশ নোটিফিকেশন সিস্টেম তৈরি করতে সহায়ক, যেমন নতুন মেসেজ, লাইক, অথবা স্ট্যাটাস আপডেট।
সারাংশ
GraphQL Subscription এর মাধ্যমে আপনি রিয়েল-টাইম ডেটা ফ্লো পরিচালনা করতে পারেন, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ইভেন্ট ড্রিভেন যোগাযোগ তৈরি করে। এটি চ্যাট অ্যাপ্লিকেশন, লাইভ ট্র্যাকিং সিস্টেম এবং অন্যান্য রিয়েল-টাইম ইন্টারঅ্যাকটিভ অ্যাপ্লিকেশনের জন্য অত্যন্ত উপযোগী। WebSocket বা HTTP/2 কানেকশন ব্যবহার করে, সার্ভার ডেটার পরিবর্তন হলে তা ক্লায়েন্টে অবিলম্বে পাঠায়।
Read more