গ্রাফকিউএল (GraphQL) একটি খুবই নমনীয় এবং শক্তিশালী API প্রযুক্তি, যা সাধারণত API versioning-এর প্রয়োজন কমিয়ে দেয়। REST API-তে, API এর ভিন্ন ভিন্ন সংস্করণ বজায় রাখতে হয় যেমন v1, v2 ইত্যাদি, তবে গ্রাফকিউএল সাধারণত একটি একক সংস্করণে কাজ করতে সক্ষম, কারণ গ্রাফকিউএল স্কিমা এবং কুয়েরি ভাষার নমনীয়তা তার সাথে কাজ করে। যদিও গ্রাফকিউএল API-র সংস্করণ পরিচালনার প্রয়োজন কম, তবে কিছু পরিস্থিতিতে API versioning গ্রাফকিউএল-এ ব্যবহৃত হতে পারে।
GraphQL API Versioning কী?
GraphQL API versioning হল একটি প্রক্রিয়া যেখানে আপনি একাধিক সংস্করণে API পরিচালনা করতে পারেন, বিশেষত যখন API-তে কিছু বৈশিষ্ট্য বা কুয়েরি পরিবর্তিত হয় এবং পুরনো সংস্করণের জন্য ব্যাকওয়ার্ড কম্প্যাটিবিলিটি বজায় রাখতে হয়। যদিও GraphQL সাধারণত একক স্কিমা এবং কুয়েরি কাঠামো ব্যবহার করে, কিছু ক্ষেত্রে deprecated fields, breaking changes, বা new features যুক্ত করার জন্য সংস্করণ পরিচালনা করা প্রয়োজন হতে পারে।
GraphQL API Versioning এর সুবিধা
- কম্প্যাটিবিলিটি বজায় রাখা:
যখন API এর নতুন সংস্করণ আসে, এটি পুরনো কুয়েরি বা মিউটেশনগুলির জন্য ব্যাকওয়ার্ড কম্প্যাটিবিলিটি বজায় রাখার সুযোগ দেয়, যাতে পুরনো ক্লায়েন্টরা তাদের ব্যবহৃত কুয়েরি বা মিউটেশন চালিয়ে যেতে পারে। - সিস্টেমের নমনীয়তা:
গ্রাফকিউএল API-এর সংস্করণ পরিচালনা করলে ডেভেলপাররা নতুন বৈশিষ্ট্য বা উন্নততর পরিবর্তনগুলি সিস্টেমে ইনকর্পোরেট করতে পারে, এবং একই সময়ে পুরনো সংস্করণে সমস্যা সৃষ্টি না করেই সেগুলি অ্যাড করা সম্ভব হয়। - সহজ পরিবর্তন ও আপডেট:
গ্রাফকিউএল স্কিমার মাধ্যমে সংস্করণ পরিচালনা করা সহজ, কারণ গ্রাফকিউএল প্রাক-ডিফাইনড ফিল্ড বা ডেটা কাঠামোর পরিবর্তনগুলি পরিচালনা করতে সহায়ক।
GraphQL API Versioning এর জন্য কিছু পদ্ধতি
যদিও গ্রাফকিউএল এ API versioning প্রয়োজনীয়তা কম, তবুও কিছু পদ্ধতি রয়েছে যার মাধ্যমে আপনি API সংস্করণ পরিচালনা করতে পারেন।
1. Schema Versioning
গ্রাফকিউএল API সংস্করণ পরিচালনার সবচেয়ে সাধারণ পদ্ধতি হল Schema Versioning। এটি প্রতিটি স্কিমার একটি সংস্করণ তৈরি করে, এবং আপনি সেই সংস্করণ অনুযায়ী ক্লায়েন্টদের রিকোয়েস্ট পরিচালনা করতে পারেন।
উদাহরণ:
# Schema version 1
type Query {
getUser(id: ID!): User
}
type User {
id: ID!
name: String
email: String
}
# Schema version 2 with additional fields
type Query {
getUser(id: ID!): User
getAllUsers: [User]
}
type User {
id: ID!
name: String
email: String
role: String
}
এখানে:
- Schema version 1 তে
getUserকুয়েরি রয়েছে। - Schema version 2 তে
getAllUsersএবংroleফিল্ডটি যুক্ত করা হয়েছে।
2. API Versioning Header
অন্য একটি পদ্ধতি হল API versioning via HTTP headers ব্যবহার করা। আপনি Authorization অথবা Versioning নামে একটি HTTP header যোগ করতে পারেন যাতে ক্লায়েন্ট সার্ভারকে নির্দিষ্ট সংস্করণে রিকোয়েস্ট পাঠায়।
উদাহরণ:
GET /graphql HTTP/1.1
Host: api.example.com
Authorization: Bearer <token>
Version: 2
এইভাবে, ক্লায়েন্ট সার্ভারের কাছে নির্দিষ্ট সংস্করণ উল্লেখ করে API রিকোয়েস্ট পাঠাতে পারে।
3. Query Arguments for Versioning
গ্রাফকিউএল এ আপনি query arguments ব্যবহার করে সংস্করণ পরিচালনা করতে পারেন, যেখানে version নামক একটি আর্গুমেন্ট যোগ করা হয়।
উদাহরণ:
query getUser($version: Int!) {
user(version: $version) {
id
name
email
}
}
এখানে:
versionআর্গুমেন্টটি গ্রাফকিউএল কুয়েরি এ যুক্ত করা হয়েছে, যাতে ক্লায়েন্ট তার চাহিদা অনুযায়ী সংস্করণ নির্বাচন করতে পারে।
4. Deprecated Fields
গ্রাফকিউএল এ deprecated fields ব্যবহারের মাধ্যমে আপনি পুরনো সংস্করণে থাকা ফিল্ডগুলো সরিয়ে না এনে ক্লায়েন্টদের জানাতে পারেন যে তারা বর্তমানে পুরনো এবং ভবিষ্যতে সরিয়ে ফেলা হবে।
উদাহরণ:
type User {
id: ID!
name: String
email: String
oldField: String @deprecated(reason: "Use newField instead")
newField: String
}
এখানে:
oldFieldএকটি deprecated ফিল্ড, এবং ক্লায়েন্টদের নতুন ফিল্ড newField ব্যবহারের জন্য পরামর্শ দেওয়া হচ্ছে।
5. Multiple Endpoints for Versioning
যদিও গ্রাফকিউএল সাধারনত একটি এন্ডপয়েন্ট ব্যবহার করে, তবে আপনি চাইলে multiple endpoints ব্যবহার করে বিভিন্ন সংস্করণের API সরবরাহ করতে পারেন।
উদাহরণ:
GET /graphql/v1GET /graphql/v2
এখানে:
v1এবংv2সংস্করণের জন্য আলাদা এন্ডপয়েন্ট ব্যবহার করা হয়েছে।
সারাংশ
GraphQL API Versioning একটি গুরুত্বপূর্ণ বিষয়, তবে এটি সাধারণত গ্রাফকিউএল এর নমনীয়তা এবং স্কিমা পরিচালনার সুবিধার কারণে কম প্রয়োজন হয়। গ্রাফকিউএল স্কিমা বা কুয়েরি ভাষায় পরিবর্তন আনলে এটি পুরনো ক্লায়েন্টদের জন্য সমস্যা তৈরি না করেই সহজেই সমাধান করা যায়। তবে, যখন breaking changes আসে, তখন স্কিমা versioning, HTTP headers-এর মাধ্যমে versioning, বা query arguments-এর মাধ্যমে সংস্করণ পরিচালনা করা যেতে পারে। এই পদ্ধতিগুলি ব্যবহার করে আপনি গ্রাফকিউএল API-র বিভিন্ন সংস্করণকে একত্রে পরিচালনা করতে পারবেন।
গ্রাফকিউএল (GraphQL)-এ API Versioning একটি গুরুত্বপূর্ণ ধারণা, যা API-র ইvolvability এবং সামঞ্জস্য বজায় রাখতে সাহায্য করে। যদিও গ্রাফকিউএল REST API-র তুলনায় অনেক বেশি নমনীয় এবং ভবিষ্যতের জন্য প্রস্তাবিত, তথাপি API সংস্করণ (versioning) ব্যবস্থাপনা একটি অত্যন্ত গুরুত্বপূর্ণ দিক। গ্রাফকিউএল-এর ডেটা স্ট্রাকচার, স্কিমা এবং রেজোলভারের পরিবর্তনগুলি যখন ঘটে, তখন API versioning নিশ্চিত করতে সাহায্য করে যাতে পূর্ববর্তী সংস্করণের ব্যবহারকারী এখনও তাদের কাজ চালিয়ে যেতে পারে।
API Versioning কী?
API Versioning হল একটি কৌশল যার মাধ্যমে আপনি আপনার API-র বিভিন্ন সংস্করণ তৈরি এবং রক্ষণাবেক্ষণ করেন। যখন আপনার API-তে কোনো গুরুত্বপূর্ণ পরিবর্তন বা আপডেট করা হয়, যেমন ফিল্ড পরিবর্তন, নতুন ফিল্ড যোগ করা, বা পুরনো ফিল্ড অপসারণ, তখন আপনি একটি নতুন সংস্করণ প্রকাশ করেন, যাতে পূর্ববর্তী সংস্করণের ব্যবহারকারী তাদের চলমান অ্যাপ্লিকেশনটি চলতে রাখতে পারে।
গ্রাফকিউএল এবং API Versioning
গ্রাফকিউএল স্বাভাবিকভাবেই অনেক বেশি versionless (অবিভাজিত) হয়, কারণ গ্রাফকিউএল স্কিমা অটোমেটিক্যালি ফিল্ড এডিশন, ডিপ্রিকেটেড ফিল্ডস এবং নতুন ফিল্ডস ম্যানেজ করার জন্য ডাইনামিক ভাবে ডিজাইন করা হয়েছে। তাই, গ্রাফকিউএল API-র মধ্যে versioning অনেকটাই সহজ, এবং বেশিরভাগ ক্ষেত্রে, এটি স্কিমার পরিবর্তনের মাধ্যমে সহজে সমাধান করা যায়। তবে, কিছু পরিস্থিতিতে API Versioning এর প্রয়োজন পড়ে, বিশেষ করে যখন বড় ধরনের পরিবর্তন করা হয়।
গ্রাফকিউএল এ API Versioning এর প্রয়োজনীয়তা
গ্রাফকিউএল API-র মধ্যে সংস্করণ পরিচালনা করার বিভিন্ন কারণ রয়েছে:
- পূর্ববর্তী সংস্করণের সঙ্গতি বজায় রাখা (Backward Compatibility): গ্রাফকিউএল API-তে যখন কোনো নতুন ফিচার বা পরিবর্তন আনা হয়, তখন পুরনো ফিচার বা ফিল্ডের সাথে সঙ্গতি বজায় রাখা খুবই গুরুত্বপূর্ণ। Versioning ব্যবহারের মাধ্যমে, পূর্ববর্তী সংস্করণের ব্যবহারকারীরা নতুন পরিবর্তন ছাড়াই তাদের অ্যাপ্লিকেশন চালিয়ে যেতে পারে।
- ফিল্ড বা টাইপ পরিবর্তন (Field or Type Changes): যখন কোনো ফিল্ড বা টাইপ পরিবর্তন হয় বা মুছে ফেলা হয়, তখন তা পূর্ববর্তী কুয়েরি বা মিউটেশন ব্যবহারের ক্ষেত্রে ত্রুটি সৃষ্টি করতে পারে। API Versioning এটি ম্যানেজ করতে সাহায্য করে।
- নতুন ফিচার বা ফাংশনালিটি যোগ করা (Adding New Features): যখন নতুন ফিচার বা ফাংশনালিটি যোগ করা হয়, যেমন নতুন টাইপ বা কুয়েরি, তখন এটি আগের গ্রাহকদের উপর কোনো প্রভাব না ফেললে গ্রাফকিউএল API Versioning ব্যবহার করে এটি পরিচালনা করা যেতে পারে।
- ভুল কনফিগারেশন বা ভেঙে যাওয়া (Breaking Changes): কখনও কখনও API-তে এমন পরিবর্তন আনা হতে পারে যা আগের সংস্করণের জন্য ভেঙে যেতে পারে। যেমন: কোন নির্দিষ্ট ফিল্ডের ডাটা টাইপ পরিবর্তন বা একটি নতুন কন্ডিশন যোগ করা, যা আগের কুয়েরির সাথে সামঞ্জস্যপূর্ণ নয়। API versioning এর মাধ্যমে এই পরিবর্তনগুলি ম্যানেজ করা যায়।
গ্রাফকিউএল API Versioning এর পদ্ধতি
গ্রাফকিউএল API versioning করার কিছু পদ্ধতি রয়েছে:
১. Deprecation (ডিপ্রিকেটেড ফিল্ডস)
গ্রাফকিউএল এর একটি গুরুত্বপূর্ণ ফিচার হলো deprecation, যেখানে আপনি একটি ফিল্ড বা টাইপকে ডিপ্রিকেটেড ঘোষণা করতে পারেন এবং ব্যবহারকারীদের একটি নতুন ফিল্ড বা টাইপ ব্যবহার করতে উৎসাহিত করতে পারেন। এটি API versioning এর একটি সহজ পদ্ধতি, যেহেতু আপনি পুরনো ফিল্ড বা টাইপ মুছে না ফেলে, বরং একটি সতর্কবার্তা দিয়ে ব্যবহারকারীদের সঠিক পথে পরিচালিত করতে পারেন।
type User {
id: ID!
name: String!
email: String! @deprecated(reason: "Use 'contactEmail' instead")
contactEmail: String!
}
এখানে:
- email ফিল্ডটি deprecated হয়েছে এবং ব্যবহারকারীদের contactEmail ফিল্ডটি ব্যবহার করার জন্য উৎসাহিত করা হয়েছে।
২. API Versioning Header (HTTP Headers-এ Versioning)
গ্রাফকিউএল API-তে আপনি HTTP Headers এর মাধ্যমে API versioning পরিচালনা করতে পারেন। আপনি গ্রাফকিউএল কুয়েরি রিকোয়েস্টে একটি version header যোগ করতে পারেন যা নির্দিষ্ট API সংস্করণটি নির্দেশ করে।
Example:
GET /graphql HTTP/1.1
Host: api.example.com
Authorization: Bearer token
X-API-Version: 2
এখানে:
- X-API-Version হেডারটি ব্যবহারকারীর রিকোয়েস্টে একটি নির্দিষ্ট সংস্করণ নির্দেশ করছে (যেমন, সংস্করণ 2)।
৩. URL Versioning (URL-এ Versioning)
গ্রাফকিউএল API-তে আপনি URL Path ব্যবহার করে versioning করতে পারেন। এটি একটি সাধারণ পদ্ধতি, যেখানে আপনি API এর URL-এ সংস্করণ নম্বর যুক্ত করেন।
Example:
https://api.example.com/v1/graphql
https://api.example.com/v2/graphql
এখানে:
- v1 এবং v2 সংস্করণ নির্দেশ করে এবং সার্ভার ব্যবহারকারীর অনুরোধ অনুযায়ী সংশ্লিষ্ট সংস্করণে রেসপন্স প্রদান করে।
৪. Schema-based Versioning (স্কিমা ভিত্তিক ভার্সনিং)
গ্রাফকিউএল স্কিমার মধ্যে ভার্সনিং করতে, আপনি স্কিমা এর বিভিন্ন ভার্সন তৈরি করতে পারেন। উদাহরণস্বরূপ, আপনি স্কিমার মধ্যে নতুন টাইপ এবং কুয়েরি যুক্ত করতে পারেন এবং পূর্ববর্তী স্কিমা সংস্করণ ব্যবহারকারীকে নির্দিষ্ট রাখতে পারেন।
Example:
# v1 schema
type Query {
getUser: User
}
# v2 schema with new features
type Query {
getUser: User
getPosts: [Post]
}
এখানে:
- v2 সংস্করণে নতুন কুয়েরি
getPostsযোগ করা হয়েছে, যা পূর্ববর্তী সংস্করণে ছিল না।
সারাংশ
গ্রাফকিউএল API-তে Versioning একটি গুরুত্বপূর্ণ প্রক্রিয়া যা ডেটার এক্সেস এবং API রক্ষণাবেক্ষণ সহজ করে তোলে। Deprecation, HTTP Headers, URL Path Versioning, এবং Schema-based Versioning এর মতো পদ্ধতিগুলি ব্যবহার করে, আপনি গ্রাফকিউএল API-এর পরিবর্তনগুলো সঠিকভাবে পরিচালনা করতে পারেন, যাতে পুরনো সংস্করণের ব্যবহারকারীরা তাদের অ্যাপ্লিকেশন অপরিবর্তিত রাখতে পারে এবং নতুন সংস্করণগুলো সহজে গ্রহণ করতে পারে। API versioning এর মাধ্যমে আপনি ব্যবহারকারীদের জন্য একটি স্থিতিশীল, স্কেলেবল এবং পারফর্ম্যান্ট API প্রদান করতে পারেন।
গ্রাফকিউএল (GraphQL) একটি অত্যন্ত নমনীয় এবং শক্তিশালী API প্রযুক্তি যা ডেটা ম্যানিপুলেশন এবং অ্যাক্সেসের ক্ষেত্রে গতি এবং দক্ষতা বৃদ্ধি করে। তবে, যখন আপনার অ্যাপ্লিকেশনটি বড় হয়ে ওঠে এবং নতুন বৈশিষ্ট্য বা আপডেট যোগ করতে হয়, তখন API Schema Evolution (স্কিমা বিবর্তন) এবং Deprecation (পূর্বাবস্থায় ব্যবহার না হওয়া) সম্পর্কে সঠিক কৌশল অবলম্বন করা অত্যন্ত গুরুত্বপূর্ণ। এটি আপনার API-কে দীর্ঘমেয়াদী এবং উন্নতমানের রাখে, এবং ব্যবহারকারীদের জন্য একটি স্বচ্ছ, নিরাপদ এবং অখণ্ড অভিজ্ঞতা প্রদান করে।
API Schema Evolution in GraphQL
API Schema Evolution হল এমন একটি প্রক্রিয়া যেখানে নতুন ফিচার যোগ করার সময় গ্রাফকিউএল স্কিমা পরিবর্তন করা হয়, তবে পুরানো ক্লায়েন্টরা এখনও API ব্যবহার করতে পারে। গ্রাফকিউএল একটি এক্সটেনসিবল এবং ফ্লেক্সিবল স্কিমা প্রবর্তন করতে সহায়ক, যা নিশ্চিত করে যে আপনি স্কিমা পরিবর্তন করলেও বৈশিষ্ট্যগুলির পেছনের সামঞ্জস্য বজায় থাকবে।
Schema Evolution এর মূল ধারণা
গ্রাফকিউএলে স্কিমার বিবর্তন সাধারণত নতুন ফিল্ডস, টাইপস, এবং মিউটেশনস যোগ করার মাধ্যমে করা হয়, তবে সেগুলি শুধুমাত্র সেই রকমভাবে করা উচিত যাতে পুরনো ক্লায়েন্টরা অব্যাহতভাবে তাদের বর্তমান কুয়েরি করতে পারে।
গ্রাফকিউএল স্কিমার বিবর্তন সাধিত হতে পারে নিম্নলিখিতভাবে:
- নতুন ফিল্ড যোগ করা: নতুন ফিল্ড যোগ করা সাধারণত নিরাপদ, কারণ পুরনো কুয়েরি বা মিউটেশন প্রভাবিত হয় না।
- টাইপ পরিবর্তন করা: নতুন টাইপ বা টাইপে ছোট পরিবর্তন (যেমন, একটি নতুন ফিল্ড যোগ করা বা অপসারণ) গ্রাফকিউএলের মধ্যে সমস্যা সৃষ্টি করতে পারে না যদি পুরনো টাইপ অপরিবর্তিত থাকে।
- Deprecation: ফিল্ড বা মিউটেশন অপসারণের পরিবর্তে deprecated ঘোষণা করা যেতে পারে, যাতে ক্লায়েন্টরা অদূর ভবিষ্যতে এটি ব্যবহার না করে।
Schema Evolution এর উদাহরণ
ধরা যাক, আপনি একটি User টাইপ তৈরি করেছেন এবং age ফিল্ডটি যুক্ত করেছেন। এখন, আপনি আপনার স্কিমায় একটি নতুন ফিল্ড address যোগ করতে চান।
type User {
id: ID!
name: String!
email: String!
age: Int
address: String # নতুন ফিল্ড
}
এখানে, আপনি address ফিল্ডটি যোগ করেছেন যা স্কিমার সাথে সামঞ্জস্যপূর্ণ এবং পুরনো কুয়েরি (যেমন getUser কুয়েরি) আগের মতো কাজ করবে।
Schema Evolution Best Practices:
- Non-breaking Changes: যখনই সম্ভব, কেবলমাত্র non-breaking changes করুন (যেমন নতুন ফিল্ড যোগ করা বা ফিল্ডের ডিফল্ট মান পরিবর্তন করা)।
- Deprecated Fields: পুরানো ফিল্ড বা ফিচার ব্যবহার করা বন্ধ করুন, তবে সরিয়ে ফেলুন না।
- Versioning Avoidance: সাধারণভাবে গ্রাফকিউএলে স্কিমা ভার্সনিং (যেমন
/v1,/v2) ব্যবহার করার প্রয়োজন হয় না, কারণ স্কিমা অবিচ্ছিন্নভাবে বিবর্তিত হতে পারে।
Deprecation in GraphQL
Deprecation হল একটি প্রক্রিয়া যেখানে একটি ফিল্ড বা মিউটেশন ব্যবহারযোগ্য না হওয়া বা পরিবর্তনযোগ্য হওয়া সত্ত্বেও, এটি আংশিকভাবে বা সম্পূর্ণরূপে ব্যবহারের জন্য অব্যবহারী ঘোষণা করা হয়। গ্রাফকিউএলে, ফিল্ড বা মিউটেশন @deprecated ডিরেকটিভ ব্যবহার করে অব্যবহৃত ঘোষণা করা যায়। এটি ব্যবহারকারীদের জানিয়ে দেয় যে এই ফিল্ড বা মিউটেশনটিকে ভবিষ্যতে সরিয়ে নেওয়া হতে পারে এবং তাদের অন্য কোনো বিকল্প ফিল্ড বা মিউটেশন ব্যবহার করার পরামর্শ দেয়।
Deprecation এর ব্যবহারের উদাহরণ:
ধরা যাক, আপনি একটি User টাইপে একটি ফিল্ড age যুক্ত করেছেন, যা এখন অব্যবহৃত। আপনি এটি @deprecated ডিরেকটিভ দিয়ে মার্ক করতে পারেন।
type User {
id: ID!
name: String!
email: String!
age: Int @deprecated(reason: "Use birthDate instead.") # Deprecated ফিল্ড
birthDate: String
}
এখানে, আমরা age ফিল্ডটিকে deprecated ঘোষণা করেছি এবং এর কারণে birthDate ফিল্ডটি ব্যবহার করার পরামর্শ দিয়েছি।
Deprecation Best Practices:
- Reason Inclusion: সবসময় reason উল্লেখ করুন কেন একটি ফিল্ড বা মিউটেশন ডিপ্রিকেট করা হয়েছে।
- Long Deprecation Period: যদি ফিল্ডটি অনেক জনপ্রিয় হয়ে থাকে, তবে ব্যবহারকারীদের জন্য এটি একটি দীর্ঘ সময়ের জন্য ডিপ্রিকেট করুন (যেমন কয়েক মাস), যাতে তারা নতুন ফিল্ড ব্যবহার করতে সঠিকভাবে প্রস্তুত হতে পারে।
- Use in Combination with Client Communication: Deprecation শুধুমাত্র স্কিমাতে নয়, আপনাকে গ্রাহকদেরও অবহিত করতে হবে। এটি কেবল তখনই কার্যকরী, যদি ক্লায়েন্টরা নতুন ফিচারে স্থানান্তরিত হয়।
Deprecation and Client Communication
গ্রাফকিউএল স্কিমা বিবর্তন এবং deprecation পরিচালনার সময়, ব্যবহারকারী বা ক্লায়েন্টদের সঠিকভাবে অবহিত করা গুরুত্বপূর্ণ। ক্লায়েন্টকে @deprecated ডিরেকটিভের মাধ্যমে জানানো হলেও, আপনি একটি communication plan তৈরি করতে পারেন যাতে ব্যবহারকারী তাদের কুয়েরির আউটপুট থেকে অব্যবহৃত ফিল্ডগুলি বাদ দিতে পারে।
Deprecation Example in Client Communication:
ক্লায়েন্টে ডিপ্রিকেটেড ফিল্ড ব্যবহারের সময়, আপনি যদি এটি পরিবর্তন বা সরিয়ে ফেলেন, তাহলে আপনাকে সেই ফিল্ডের পরিবর্তে নতুন বিকল্পের জন্য কুয়েরি বা মিউটেশন তৈরি করার জন্য গ্রাহককে জানাতে হবে। উদাহরণস্বরূপ:
query {
getUser(id: "123") {
name
birthDate # Use birthDate instead of age
}
}
এখানে, ক্লায়েন্টের কুয়েরিতে নতুন birthDate ফিল্ড ব্যবহার করা হচ্ছে, যেটি age ফিল্ডের পরিবর্তে এসেছে।
Best Practices for API Schema Evolution and Deprecation
- Avoid Breaking Changes: স্কিমা পরিবর্তন করার সময় breaking changes (যেমন, ফিল্ড বা টাইপ মুছে ফেলা) এড়ানোর চেষ্টা করুন।
- Deprecate, Don't Delete: কখনই ডিরেক্টভাবে কোনো ফিল্ড মুছে ফেলবেন না। এর পরিবর্তে @deprecated ডিরেকটিভ ব্যবহার করুন, যাতে ক্লায়েন্টরা আপডেট করতে পারে।
- Clear Communication: ক্লায়েন্টদের জানিয়ে দিন যে কোন ফিল্ড বা মিউটেশন ডিপ্রিকেট করা হয়েছে এবং পরিবর্তে কোন ফিল্ড বা মিউটেশন ব্যবহার করা উচিত।
- Versioning: যদিও গ্রাফকিউএলে versioning প্রয়োজন হয় না, তবে যখন স্কিমা বড় পরিবর্তন হয়, তখন এটি ক্লায়েন্টদের জন্য স্পষ্ট করে দিতে পারে।
সারাংশ
API Schema Evolution এবং Deprecation হল গ্রাফকিউএল স্কিমা পরিবর্তনের গুরুত্বপূর্ণ অংশ। স্কিমা বিবর্তন এবং ডিপ্রিকেটেড ফিল্ড ব্যবস্থাপনা সঠিকভাবে করা হলে, আপনার API-র উপর নির্ভরশীল ক্লায়েন্টরা আপডেটের সময় কোনো বিরক্তি ছাড়াই তাদের কুয়েরি বা মিউটেশন ব্যবহার করতে পারে। এটি API-এর দীর্ঘমেয়াদী সাফল্য এবং ব্যবহারকারীর জন্য একটি স্থিতিশীল অভিজ্ঞতা নিশ্চিত করে।
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 শেয়ার করার এবং ডেটা একত্রিত করার সুযোগ দেয়।
Multiple Version Handling বা Multiple API Versioning গ্রাফকিউএল (GraphQL) এর ক্ষেত্রে একটি গুরুত্বপূর্ণ চ্যালেঞ্জ, বিশেষত যখন আপনার API ক্রমাগত আপডেট হয় এবং একাধিক সংস্করণ পরিচালনা করতে হয়। গ্রাফকিউএল API-তে সংস্করণিং সাধারণত REST API-র মতো সরাসরি নির্দিষ্ট সংস্করণ পাথ ব্যবহার করে করা হয় না, কিন্তু এটি সঠিকভাবে পরিচালনা করতে কিছু কৌশল এবং ডিজাইন প্যাটার্ন ব্যবহার করা যেতে পারে। এখানে আমরা গ্রাফকিউএল API তে Multiple Version Handling Techniques এর কিছু সাধারণ পদ্ধতি এবং তাদের ব্যবহার ব্যাখ্যা করব।
GraphQL-এ Multiple Version Handling কীভাবে কাজ করে?
GraphQL-এর প্রকৃতি অনুযায়ী, এটি স্কিমা-ভিত্তিক এবং একটি গ্রাফ স্টাইলের API, যেখানে আপনি ডেটার মধ্যে সম্পর্ক স্থাপন করতে পারেন। তবে যখন আপনার API-তে নতুন ফিচার যোগ করা হয় বা বিদ্যমান ফিচারের আচরণ পরিবর্তন করা হয়, তখন আপনি পুরানো সংস্করণগুলিকে সমর্থন করতে এবং নতুন সংস্করণে আপগ্রেড করতে চান।
GraphQL API তে Versioning সাধারণত দুটি পদ্ধতিতে করা হয়:
- Schema-Based Versioning (স্কিমা-বেসড সংস্করণিং)
- Field/Directive-Based Versioning (ফিল্ড বা ডিরেকটিভ-বেসড সংস্করণিং)
এখানে আমরা এই দুটি পদ্ধতির বিবরণসহ অন্যান্য কার্যকর কৌশলগুলি আলোচনা করব।
1. Schema-Based Versioning
Schema-Based Versioning হল একটি পদ্ধতি যেখানে আপনি API-র বিভিন্ন সংস্করণের জন্য আলাদা স্কিমা তৈরি করেন। এটি একে অপরের সাথে স্বাধীনভাবে সংস্করণ পরিচালনার সুযোগ দেয়। যদি কোনও স্কিমা আপডেট করতে হয় (যেমন নতুন ফিল্ড যোগ করা বা বিদ্যমান ফিল্ড পরিবর্তন করা), তাহলে আপনি একটি নতুন সংস্করণের স্কিমা তৈরি করতে পারেন এবং পুরনো সংস্করণটির সাথে এটি পাশাপাশি রাখতে পারেন।
এই পদ্ধতির সুবিধা:
- সহজ এবং পরিষ্কারভাবে সংস্করণ পরিচালনা করা যায়।
- স্কিমার মধ্যে পরিবর্তন করে আপনি নতুন সংস্করণ তৈরি করতে পারেন, এবং ক্লায়েন্টরা তাদের ব্যবহৃত সংস্করণে থাকতে পারে।
এই পদ্ধতির সীমাবদ্ধতা:
- একাধিক স্কিমার পরিচালনা করা অনেক সময় জটিল হতে পারে।
- স্কিমার মধ্যে সম্পর্ক বা ডেটার সমন্বয়ের সমস্যা হতে পারে, যেমন একই ডেটা জন্য বিভিন্ন কনফিগারেশন।
Example:
আপনি দুটি আলাদা স্কিমা তৈরি করতে পারেন: v1 এবং v2।
# v1 schema
type Query {
getUser(id: ID!): User
}
type User {
id: ID!
name: String!
}
# v2 schema
type Query {
getUser(id: ID!): User
getUsersByEmail(email: String!): [User]
}
type User {
id: ID!
name: String!
email: String
}
এখানে, v2 স্কিমায় নতুন getUsersByEmail ফিল্ড যোগ করা হয়েছে। ক্লায়েন্টরা যেকোনো সংস্করণ ব্যবহার করতে পারে এবং সার্ভারে এদের আলাদা আলাদা স্কিমা পরিচালনা করা হবে।
Apollo Server-এ সংস্করণ পরিচালনার জন্য, আপনি আলাদা ApolloServer ইনস্ট্যান্স তৈরি করতে পারেন।
const { ApolloServer } = require('apollo-server');
const serverV1 = new ApolloServer({ typeDefs: schemaV1, resolvers });
const serverV2 = new ApolloServer({ typeDefs: schemaV2, resolvers });
serverV1.listen(4000).then(() => console.log("Server V1 running"));
serverV2.listen(5000).then(() => console.log("Server V2 running"));
এটি আপনাকে v1 এবং v2 সংস্করণের জন্য আলাদা সার্ভার পরিচালনা করতে সহায়তা করবে।
2. Field/Directive-Based Versioning
এটি এমন একটি পদ্ধতি যেখানে আপনি শুধুমাত্র স্কিমার ফিল্ড বা ডিরেকটিভের মাধ্যমে সংস্করণ পরিচালনা করেন, যেমন নতুন ফিল্ড বা পুরনো ফিল্ড বাদ দেওয়া, তবে মূল স্কিমা একে অপরের সাথে সম্পর্কিত থাকে।
এই পদ্ধতির সুবিধা:
- স্কিমার বড় সংস্করণের পরিবর্তন ছাড়াই সামান্য আপডেট করা সম্ভব।
- ক্লায়েন্টরা পুরানো ফিল্ডগুলিকে এখনও ব্যবহার করতে পারে এবং নতুন ফিল্ড ব্যবহার করে নতুন সংস্করণে কাজ করতে পারে।
Example:
এখানে, আমরা একটি কাস্টম ডিরেকটিভ ব্যবহার করব যা গ্রাফকিউএল ফিল্ডের সংস্করণ নির্ধারণ করবে। ধরুন, আমরা একটি @deprecated ডিরেকটিভ ব্যবহার করতে পারি।
type Query {
getUser(id: ID!): User
getUserEmail(id: ID!): String @deprecated(reason: "Use getUserEmailV2 instead")
getUserEmailV2(id: ID!): String
}
type User {
id: ID!
name: String
}
এখানে:
- getUserEmail ফিল্ডটি পুরানো সংস্করণের ফিল্ড হিসেবে @deprecated ডিরেকটিভ সহ চিহ্নিত করা হয়েছে।
- getUserEmailV2 হল নতুন সংস্করণের ফিল্ড।
আপনি চাইলে আরও কাস্টম ডিরেকটিভ তৈরি করতে পারেন, যেমন @new, @legacy, ইত্যাদি, যা ফিল্ডের সংস্করণ শনাক্ত করতে ব্যবহার করা যেতে পারে।
3. Query-Based Versioning
এটি একটি সহজ পদ্ধতি, যেখানে আপনি একটি কুয়েরি বা মিউটেশন নামের মাধ্যমে সংস্করণ নির্ধারণ করেন। গ্রাফকিউএল ক্লায়েন্ট নির্দিষ্ট সংস্করণ ব্যবহার করতে চাইলে, তারা সেই সংস্করণটির কুয়েরি বা মিউটেশন নামটি পাঠাবে।
এই পদ্ধতির সুবিধা:
- একটি নির্দিষ্ট সংস্করণের কুয়েরি বা মিউটেশন নাম ব্যবহার করলে সরাসরি সংস্করণ ব্যবস্থাপনা হয়।
Example:
# v1 version query
query GetUserV1 {
getUser(id: "1") {
id
name
}
}
# v2 version query
query GetUserV2 {
getUser(id: "1") {
id
name
email
}
}
এখানে, দুটি আলাদা কুয়েরি নাম ব্যবহৃত হয়েছে — GetUserV1 এবং GetUserV2, যাতে ক্লায়েন্ট নির্দিষ্ট সংস্করণের কুয়েরি ব্যবহার করতে পারে।
4. Header-Based Versioning
এটি একটি আধুনিক পদ্ধতি যেখানে আপনি HTTP headers এর মাধ্যমে সংস্করণ পরিচালনা করেন। গ্রাফকিউএল সার্ভার একটি নির্দিষ্ট সংস্করণের জন্য কাস্টম হেডার চেক করে এবং সেই অনুযায়ী স্কিমা বা কুয়েরি প্রসেস করে।
এই পদ্ধতির সুবিধা:
- ক্লায়েন্টকে সংস্করণের নাম উল্লেখ করতে হয় না, এটি সরাসরি হেডারে পাঠানো হয়।
- একাধিক সংস্করণ পরিচালনা করার সময় ইউজারের অভিজ্ঞতা উন্নত হয়।
Example:
const { ApolloServer } = require('apollo-server');
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
const version = req.headers['api-version']; // header থেকে version গ্রহণ
if (version === 'v2') {
// v2 স্কিমা রিটার্ন করুন
}
return {}; // default version বা v1
}
});
server.listen().then(({ url }) => {
console.log(`Server running at ${url}`);
});
এখানে:
- ক্লায়েন্ট একটি কাস্টম api-version হেডার পাঠাবে এবং সার্ভার সেই হেডারের ভিত্তিতে সংস্করণ নির্বাচন করবে।
Conclusion
GraphQL-এ Multiple Version Handling একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা বিভিন্ন সংস্করণের সমর্থন এবং পরিচালনা সহজ করে তোলে। Schema-Based Versioning, Field/Directive-Based Versioning, Query-Based Versioning, এবং Header-Based Versioning এর মাধ্যমে আপনি একটি স্কেলেবল এবং নমনীয় API তৈরি করতে পারেন। প্রতিটি পদ্ধতির নিজস্ব সুবিধা এবং সীমাবদ্ধতা রয়েছে, এবং আপনার অ্যাপ্লিকেশনের চাহিদা অনুযায়ী সঠিক পদ্ধতি নির্বাচন করা উচিত।
Read more