GraphQL Schema Federation হল একটি পদ্ধতি যা বিশাল এবং স্কেলেবল GraphQL API তৈরি করতে ব্যবহৃত হয়, যেখানে একাধিক GraphQL সার্ভার বা মাইক্রোসার্ভিস একে অপরের সাথে Federate হয়। এর মাধ্যমে আপনি একাধিক স্কিমা বা সার্ভিসকে একত্রিত করতে পারেন, এবং ইউজারদের কাছে একটি একক, সংহত (unified) API প্রদান করতে পারেন। GraphQL API শেয়ার করা বা Federation মডেল আপনাকে বিভিন্ন ডোমেন বা সার্ভিসের মধ্যে GraphQL কুয়েরি শেয়ার করার সুযোগ দেয়, যা একটি বৃহত্তর, পরিচালনাযোগ্য এবং পুনঃব্যবহারযোগ্য অ্যাপ্লিকেশন তৈরি করতে সহায়ক।
GraphQL Schema Federation কী?
Schema Federation হল একটি পদ্ধতি যেখানে একাধিক ডোমেন বা সার্ভিসের স্কিমাগুলিকে একত্রিত করা হয় এবং তাদের জন্য একটি কেন্দ্রীয় API তৈরি করা হয়। এটি মূলত Apollo Federation দ্বারা বাস্তবায়িত হয়েছে, যেখানে একাধিক ছোট সার্ভিস বা মাইক্রোসার্ভিস একটি বৃহত্তর সার্ভিসে একত্রিত হয়।
Federation এর মূল বৈশিষ্ট্যসমূহ:
- মাইক্রোসার্ভিস আর্কিটেকচার:
Federation ডেভেলপারদের মাইক্রোসার্ভিস আর্কিটেকচার এর মধ্যে বিভিন্ন গ্রাফকিউএল স্কিমাকে একত্রিত করতে সহায়ক। এটি প্রতিটি মাইক্রোসার্ভিসের নিজস্ব স্কিমা নিয়ে কাজ করতে দেয়, এবং তারপর একটি একক গ্রাফকিউএল API তৈরি হয়। - ফেডারেটেড স্কিমা:
প্রতিটি সার্ভিসের স্কিমা একটি@keyডিরেকটিভ দিয়ে চিহ্নিত করা হয়, যার মাধ্যমে ওই সার্ভিসের ফিল্ডগুলো অন্য স্কিমাতে রেফারেন্স করা যায়। - একক API:
ফেডারেটেড স্কিমার মাধ্যমে একাধিক সার্ভিসের তথ্য একটি API-তে যোগ করা হয়, যার ফলে গ্রাহক বা ক্লায়েন্ট শুধুমাত্র একটি একক কুয়েরি ব্যবহার করে সমস্ত তথ্য পেতে পারে। - ডেটা অটোমেটিক্যালি সংহত করা (Automatic Data Merging):
স্কিমা ফেডারেশন ব্যবহারের মাধ্যমে, বিভিন্ন সার্ভিসের ডেটা একে অপরের সাথে অটোমেটিক্যালি সংহত হয়।
GraphQL Schema Federation কিভাবে কাজ করে?
GraphQL Federation এ, প্রতিটি সার্ভিসের একটি উদ্বোধন স্কিমা (primary schema) থাকে, এবং অন্যান্য সার্ভিস বা ডোমেনের সাথে ট্রাস্টেড রেফারেন্স তৈরি করতে হয়। এটি Apollo Server এর সাথে সবচেয়ে জনপ্রিয়ভাবে ব্যবহৃত হয়।
Federation সেটআপের প্রক্রিয়া:
- Primary Service (Main Schema) সেটআপ: প্রথমে একটি প্রাথমিক সার্ভিস বা মূল স্কিমা তৈরি করতে হয় যা সমস্ত ফেডারেটেড স্কিমাকে একত্রিত করবে। এই স্কিমায় মূলত সমস্ত সার্ভিসের সংহত ফিল্ড থাকবে।
- Service Subschemas: প্রতিটি সার্ভিস বা মাইক্রোসার্ভিসের নিজস্ব স্কিমা থাকবে, যেখানে প্রতিটি স্কিমার জন্য
@keyডিরেকটিভ এবং অন্যান্য স্কিমা থেকে রেফারেন্স করা যায় এমন ফিল্ড থাকবে। - Schema Gateway: সবশেষে, GraphQL Gateway বা Apollo Gateway সেটআপ করা হয়, যা সমস্ত ফেডারেটেড স্কিমা গুলির জন্য একটি একক API তৈরি করবে। এটি একটি API গেটওয়ে হিসেবে কাজ করবে, যা সমস্ত সাবস্কিমার (subschemas) থেকে ডেটা সংগ্রহ করবে।
Apollo Federation এর মাধ্যমে Schema Federation সেটআপ
Apollo Federation একটি ওপেন সোর্স লাইব্রেরি যা স্কিমা ফেডারেশন সহজ করে তোলে। এখানে কিভাবে এটি সেটআপ করতে হয় তা দেখানো হলো:
1. Subservice (Subschema) তৈরি করা
ধরা যাক, আমরা একটি User Service এবং একটি Post Service তৈরি করতে চাই।
User Service Schema:
const { gql } = require('apollo-server');
const typeDefs = gql`
type User {
id: ID!
name: String
posts: [Post]
}
type Query {
users: [User]
}
extend type Query {
user(id: ID!): User
}
@key(fields: "id")
type Post {
id: ID!
title: String
}
`;
const resolvers = {
Query: {
users: () => { /* Fetch Users from DB */ },
user: (_, { id }) => { /* Fetch a specific user by ID */ }
},
User: {
posts: (user) => { /* Fetch posts by User ID */ }
}
};
module.exports = { typeDefs, resolvers };
Post Service Schema:
const { gql } = require('apollo-server');
const typeDefs = gql`
type Post {
id: ID!
title: String
user: User
}
type Query {
posts: [Post]
}
extend type Query {
post(id: ID!): Post
}
@key(fields: "id")
type User {
id: ID!
name: String
}
`;
const resolvers = {
Query: {
posts: () => { /* Fetch Posts from DB */ },
post: (_, { id }) => { /* Fetch a specific post by ID */ }
},
Post: {
user: (post) => { /* Fetch User by Post UserID */ }
}
};
module.exports = { typeDefs, resolvers };
2. Apollo Gateway (Main Schema) তৈরি করা
এখন, সমস্ত সাবস্কিমা গুলো একত্রিত করতে Apollo Gateway ব্যবহার করা হবে। এটি মূলত সমস্ত সার্ভিসের স্কিমা একত্রিত করবে এবং একটি একক API তৈরি করবে।
const { ApolloServer } = require('apollo-server');
const { ApolloGateway } = require('@apollo/gateway');
const gateway = new ApolloGateway({
serviceList: [
{ name: 'users', url: 'http://localhost:4001' },
{ name: 'posts', url: 'http://localhost:4002' }
]
});
const server = new ApolloServer({
gateway,
subscriptions: false // For now, we disable subscriptions
});
server.listen(4000).then(({ url }) => {
console.log(`Server running at ${url}`);
});
3. সার্ভিসগুলো চালু করা
প্রতিটি সাবস্কিমা সার্ভিস চালু করুন:
node user-service.js # Runs on port 4001
node post-service.js # Runs on port 4002
এখন আপনি Apollo Gateway (এটিতে মূল স্কিমা এবং সমস্ত সাবস্কিমা রয়েছে) চালু করুন:
node gateway.js # Runs on port 4000
4. কুয়েরি (Query) করা
তিনটি সার্ভিস একত্রিত করার পরে, আপনি একটি কুয়েরি ব্যবহার করে সমস্ত ডেটা একত্রে পেতে পারবেন:
query {
users {
id
name
posts {
title
}
}
}
এই কুয়েরি গ্রাফকিউএল API-র মাধ্যমে সমস্ত ডেটা একত্রিত করবে, যেখানে User Service এবং Post Service উভয়ের ডেটা একত্রিত হবে।
GraphQL API শেয়ার করা এবং সুবিধা
GraphQL Schema Federation এর মাধ্যমে একাধিক GraphQL সার্ভিস বা মাইক্রোসার্ভিসের মধ্যে API শেয়ার করা সম্ভব হয়। এর মাধ্যমে, একাধিক ছোট ছোট সার্ভিস একত্রিত করে একটি বৃহত্তর GraphQL API তৈরি করা হয়, যা:
- স্কেলেবিলিটি উন্নত করে,
- পারফরম্যান্স অপটিমাইজেশন নিশ্চিত করে,
- একাধিক ডোমেন বা সার্ভিসের ডেটা সহজেই শেয়ার এবং ম্যানেজ করতে সাহায্য করে।
এটি বিশেষ করে মাইক্রোসার্ভিস আর্কিটেকচার এবং বড় অ্যাপ্লিকেশন গুলির জন্য খুবই উপযোগী।
সারাংশ
GraphQL Schema Federation আপনাকে একাধিক মাইক্রোসার্ভিস বা সার্ভিসের স্কিমাগুলিকে একত্রিত করে একটি সেন্ট্রালাইজড, ইউনিফাইড গ্রাফকিউএল API তৈরি করতে সহায়ক। Apollo Federation-এর মাধ্যমে এটি বাস্তবায়ন করা সহজ, যেখানে একাধিক সার্ভিসের জন্য আলাদা স্কিমা থাকে এবং একটি গেটওয়ে API তাদের একত্রিত করে। এটি ডেভেলপারদের সহজে API শেয়ার করার এবং ডেটা একত্রিত করার সুযোগ দেয়।
Read more