PubSub (Publish-Subscribe) হল একটি কমিউনিকেশন প্যাটার্ন যা Event-Driven Architecture (EDA) এর মধ্যে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, এবং এটি GraphQL-এ রিয়েল-টাইম ডেটা ট্রান্সফার করার জন্য ব্যবহৃত হয়। PubSub প্যাটার্নের মাধ্যমে, আপনি একটি অ্যাপ্লিকেশন বা সিস্টেমে বিভিন্ন কম্পোনেন্টের মধ্যে ডেটার অ্যাসিঙ্ক্রোনাস কমিউনিকেশন সহজে পরিচালনা করতে পারেন।
এই মডেলটি Publishers এবং Subscribers এর মধ্যে যোগাযোগের মাধ্যমে কাজ করে। একটি Publisher ইভেন্ট পাঠায় এবং Subscriber সেই ইভেন্টটি গ্রহণ করে এবং তার সাথে প্রতিক্রিয়া জানায়। GraphQL-এর মধ্যে PubSub ব্যবহার করে আপনি real-time events ম্যানেজ করতে পারেন এবং live data updates ক্লায়েন্টে পাঠাতে পারেন, যেমন chat messages, live scores, notifications, এবং অন্যান্য রিয়েল-টাইম ইভেন্ট।
এখানে GraphQL PubSub ব্যবহার করে Event Driven Architecture তৈরি করার পদ্ধতি ব্যাখ্যা করা হলো।
PubSub প্যাটার্ন কী?
PubSub হল একটি বার্তা প্রেরণ প্যাটার্ন যেখানে:
- Publishers ইভেন্ট বা বার্তা তৈরি করে এবং এটি নির্দিষ্ট Topics বা Channels এ প্রেরণ করে।
- Subscribers নির্দিষ্ট Topics বা Channels এর প্রতি সাবস্ক্রাইব করে এবং যখনই কোনো ইভেন্ট সেই Topic বা Channel এ আসে, তখন তারা সেই ইভেন্ট বা বার্তা গ্রহণ করে।
এই প্যাটার্নটি event-driven কমিউনিকেশন সিস্টেম তৈরি করতে সহায়ক।
PubSub ব্যবহারের জন্য GraphQL Subscription
GraphQL Subscription হল GraphQL এর একটি ফিচার যা ক্লায়েন্টদের real-time data গ্রহণ করার সুযোগ দেয়। এটি সাধারণত WebSocket বা HTTP long polling ব্যবহার করে কাজ করে, যেখানে সার্ভার এবং ক্লায়েন্টের মধ্যে একটি উন্মুক্ত কানেকশন তৈরি হয় এবং সার্ভার যখনই ডেটাতে পরিবর্তন করে, তখন তা ক্লায়েন্টকে রিয়েল-টাইমে জানানো হয়।
এখানে PubSub এবং GraphQL Subscription একসাথে ব্যবহারের মাধ্যমে ইভেন্ট ড্রিভেন আর্কিটেকচার তৈরি করা হবে।
ধাপ ১: Apollo Server সেটআপ
প্রথমে, আপনাকে Apollo Server এবং Apollo Server PubSub ইনস্টল করতে হবে। PubSub ইভেন্টগুলির মধ্যে যোগাযোগের জন্য ব্যবহৃত হবে।
npm install apollo-server graphql
npm install @apollo/subgraph
এখন, আপনার অ্যাপ্লিকেশনে PubSub সেটআপ করুন:
const { ApolloServer, gql, PubSub } = require('apollo-server');
const pubsub = new PubSub();
const MESSAGE_ADDED = 'MESSAGE_ADDED';
// GraphQL schema
const typeDefs = gql`
type Message {
id: ID!
content: String!
user: String!
}
type Query {
messages: [Message]
}
type Mutation {
addMessage(content: String!, user: String!): Message
}
type Subscription {
messageAdded: Message
}
`;
// Resolvers
const resolvers = {
Query: {
messages: () => [], // Initially, empty array
},
Mutation: {
addMessage: (_, { content, user }) => {
const message = { id: Math.random().toString(), content, user };
// Publish event when new message is added
pubsub.publish(MESSAGE_ADDED, { messageAdded: message });
return message;
},
},
Subscription: {
messageAdded: {
subscribe: () => pubsub.asyncIterator([MESSAGE_ADDED]),
},
},
};
// Apollo Server instance
const server = new ApolloServer({
typeDefs,
resolvers,
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে:
- PubSub ক্লাস ব্যবহার করা হয়েছে এবং
MESSAGE_ADDEDটপিকের মাধ্যমে একটি ইভেন্ট পাবলিশ করা হচ্ছে। - Mutation এর মাধ্যমে নতুন মেসেজ তৈরি হলে, সেই মেসেজ PubSub মাধ্যমে সাবস্ক্রাইবারদের পাঠানো হচ্ছে।
ধাপ ২: Client Subscription (Real-time Data)
এখন, আপনি GraphQL Subscription ব্যবহার করে ক্লায়েন্ট সাইডে রিয়েল-টাইম ডেটা পেতে পারবেন। এটি সাধারণত WebSocket মাধ্যমে কাজ করে।
Apollo Client ইনস্টল করুন:
npm install @apollo/client graphql subscriptions-transport-ws
এখন, গ্রাফকিউএল সাবস্ক্রিপশন ক্লায়েন্ট তৈরি করুন:
import { ApolloClient, InMemoryCache, ApolloProvider, gql } from '@apollo/client';
import { WebSocketLink } from '@apollo/client/link/ws';
// Apollo Client setup
const client = new ApolloClient({
link: new WebSocketLink({
uri: 'ws://localhost:4000/graphql',
options: {
reconnect: true,
},
}),
cache: new InMemoryCache(),
});
const MESSAGE_ADDED_SUBSCRIPTION = gql`
subscription {
messageAdded {
id
content
user
}
}
`;
// Subscribe to the messageAdded event
const MessageList = () => {
const { data, loading } = useSubscription(MESSAGE_ADDED_SUBSCRIPTION);
if (loading) return <p>Loading...</p>;
return (
<div>
{data.messageAdded.map(message => (
<div key={message.id}>
<strong>{message.user}</strong>: {message.content}
</div>
))}
</div>
);
};
// App component
function App() {
return (
<ApolloProvider client={client}>
<MessageList />
</ApolloProvider>
);
}
এখানে:
- WebSocketLink ব্যবহার করা হয়েছে যা WebSocket এর মাধ্যমে GraphQL Subscription এর সাথে কানেক্ট করে।
- useSubscription হুক ব্যবহার করা হয়েছে গ্রাফকিউএল সাবস্ক্রিপশনের মাধ্যমে রিয়েল-টাইম ডেটা পাওয়ার জন্য।
ধাপ ৩: PubSub ইভেন্ট ট্রান্সমিশন
প্রথমে, ক্লায়েন্ট একটি সাবস্ক্রিপশন (messageAdded) শুরু করে, এবং যখনই সার্ভারে একটি নতুন মেসেজ তৈরি হয় (addMessage মিউটেশন), তখন সেই মেসেজ PubSub এর মাধ্যমে ক্লায়েন্টে পাঠানো হবে। ক্লায়েন্ট যখন messageAdded সাবস্ক্রাইব করে, তখন তা সরাসরি রিয়েল-টাইমে দেখাবে।
এটি Event Driven Architecture কে কার্যকরভাবে বাস্তবায়ন করতে সাহায্য করে, যেখানে একটি ইভেন্ট যেমন নতুন মেসেজ, একজন ইউজারের লগইন, বা কোনো রিয়েল-টাইম ফিড সার্ভার থেকে গ্রাহকদের কাছে জানানো হয়।
ফায়দা ও সুবিধা
- Real-Time Communication: PubSub এবং GraphQL Subscription ব্যবহার করে আপনি সিস্টেমে রিয়েল-টাইম ডেটা আপডেট করতে পারেন।
- Scalability: আপনি সহজেই PubSub ব্যবস্থার মাধ্যমে মাইক্রোসার্ভিস আর্কিটেকচার এবং বড় সিস্টেমে ইভেন্ট ড্রিভেন যোগাযোগ ব্যবস্থা তৈরি করতে পারেন।
- Decoupling: Publish-Subscribe প্যাটার্নের মাধ্যমে ডেটা প্রোভাইডার (publisher) এবং কনজিউমার (subscriber) একে অপর থেকে আলাদা থাকে, যা অ্যাপ্লিকেশনের নমনীয়তা বৃদ্ধি করে।
- Efficiency: PubSub ইভেন্ট প্যাটার্ন কমিউনিকেশন সিস্টেমের মধ্যে আসন্ন ডেটা ফ্লো উন্নত করে এবং কার্যকারিতা বৃদ্ধি করে, কারণ বার্তা শুধু ইভেন্টে সাবস্ক্রাইব করা ক্লায়েন্টদের কাছে পাঠানো হয়।
সারাংশ
PubSub ব্যবহার করে Event Driven Architecture তৈরি করা GraphQL-এ রিয়েল-টাইম ডেটা আপডেট করার জন্য একটি শক্তিশালী পদ্ধতি। এটি Publishers এবং Subscribers এর মধ্যে একত্রিত যোগাযোগ তৈরি করে, যা WebSocket বা HTTP long polling এর মাধ্যমে রিয়েল-টাইম ডেটা ট্রান্সফার করতে সহায়ক। GraphQL Subscription ব্যবহার করে, PubSub প্যাটার্নের মাধ্যমে ইভেন্টগুলি ক্লায়েন্টে পাঠানো যায়, যা অত্যন্ত দক্ষ এবং স্কেলেবল সিস্টেম তৈরি করতে সাহায্য করে।
Read more