ডিজাইনিং রেস্ট এপিআই [৫] : এপিআই ভার্সনিং

in ডিজাইনিং রেস্ট এপিআই,

এপিআই সবসময় পরিবর্তনশীল । আপনি কখনই আশা করতে পারেন না যে এপিআই সারাজীবন এক থাকবে । এপিআই তে অনেক বাগ থাকবে সেগুলো ফিক্স করার প্রয়োজন পড়বে, সিকিউরিটি প্যাচ দেয়া লাগতে পারে, নতুন ফিচার বা ফাংশনালিটি যোগ করতে হবে। এসব পরিবর্তন কিভাবে করবেন?

ধরুন আপনি অর্ডার সিস্টেমে আমুল পরিবর্তন আনতে চাইছেন যেমন, ব্যাং পেমেন্ট এড করবেন এবং স্ক্রিল পেমেন্ট রিমুভ করে দিবেন । তাহলে বর্তমানে আপনার এই পেমেন্ট এর ভিত্তিতে যারা সিস্টেমটি বানিয়েছিল তাদের ওখানে ইরর দেখাবে । আপনি পাবলিক এপিআই এর কোন ফিচার চাইলেই বিনা নোটিশে চেন্জ করে দিতে পারেন না । কারন আপনার স্টেবল রিলিজের উপর ভিত্তি করে অনেক কিছু ডেভেলপ করা ।

এপিআই ভার্সনিং

এপিআই ভার্সনিং হল আপনার র্বতমান সার্ভিসটি ঠিক রেখে নতুন কোন পরিবর্তন আনার একটি সহজ উপায় । আপনার যখনই কোন পরিবর্তন আনতে চান তখনই আপনাকে মাথায় রাখতে হবে যে আপনি আগের ভার্সনে কোন পরিবর্তন আনতে পারবেন না। ছোট পরিকর্তন হলেও সেটিকে আরেকটি ভার্সনে [ v1.06 অথবা v2.0 ] পাবলিশ করতে হবে। তবে ছোট ছোট পরিবর্তন কমিয়ে একটি মুখ্য [v1 » v2 » v3] স্ট্যাবল রিলিজ দেয়াই ভাল। এতে যেমন ইনভ্যালিড রিকোয়েস্ট কমে যায় তেমনি কনজিমারদের মধ্যে দ্বিধা সৃষ্টি হয় না ।
‌এপিআই ভার্সনিং এবং ভার্সন ম্যানেজমেন্ট

উপরের চিত্রের মত প্রতিটি নতুন ভার্সন আপনার সার্ভিসকে আগের চেয়ে ভালো এবং একটু আলাদা ভাবে প্রেজেন্ট করবে। তাই এপিআই এর প্রথম ভার্সনের জন্যেও আপনাকে এপিআই ভার্সনিং ফলো করতে হবে । কখনই প্রথম ভার্সনটি ভার্সন আডেন্টিফায়ার ছাড়া পাবলিশ করা উচিত না। ভার্সনিং রেস্ট এপিআই ডিজাইনের একটি বাধ্যতামূলক কম্পোনেন্ট এবং প্রথম ভার্সনটির ক্ষেত্রে host.com/api/user এর পরিবর্তে host.com/api/v1/user v+ভার্সন কোড দিয়ে প্রকাশ করতে হবে।

Versioning an interface is just a “polite” way to kill deployed clients.

— Roy Fielding.

ভার্সন ম্যানেজ করবেন কিভাবে?

কখন কেন নতুন ভার্সন আনবেন সেটা নিয়ে আপনাকে অবশ্যই বিশদ বিশ্লেষন করে একটি উপযুক্ত সিদ্ধান্তে আসতে হবে। কখন সিদ্ধান্ত নিবেন যে আরকটি নতুন ভার্সন আনবেন? আপনি যদি এপিআই এর সম্পূর্ন কোড ফেলে দিয়ে নতুন করে আবার আরেকটি এপিআই বানান এবং ফাংশনালিটি অর্থাৎ ইনপুট আউটপুটে কোন পরিবর্তন না আসে তাহলে আপনার নতুন ভার্সনের কোন প্রয়োজন নেই । ব্যাক-এন্ড এ আপনি হয়তো আগে MySQL ডাটাবেজ ব্যবহার করছেন, কিন্তু এখন MongoDB ব্যবহার করবেন তাতে কি এপিআই কনজিউমারের কিছু যায় আসে? সুতরাং কেবল মাত্র যখনই নতুন কোন ফিচার বা ফাংশনালিটি যোগ বা পরিবর্তন করবেন কেবল তখনই আপনার আরেকটি ভার্সনের প্রয়োজন পড়বে।

কতগুলো ভার্সন ম্যানেজ করবেন ?

এপিআই ভার্সনিং এর ক্ষেত্রে আরেকটি গুরুত্বপূর্ন বিষয় হল, নতুন ভার্সন আনার সাথে সাথে পুরোনো ভার্সনগুলো বাতিল করে দেয়া যাবে না। আপনার পুরোনো ভার্সন কতজন ব্যবহার করছে তার উপর ভিত্তি করে কিংবা আপনার সার্ভিস পলিসি অনুযায়ী আপনাকে পুরোনো ভার্সন বাতিলের সিদ্ধান্ত নিতে হবে। খুব ঘন ঘন যেমন পরিবর্তন করা ঠিক না কারন শুধু নতুন এপিআই নিয়ে আসলেই হবে না কনজিমারদের কেও জানাতে হবে। তাদেরকে নতুন এপিআই ইম্প্লিমেন্ট করার জন্য সময় দিতে হবে ।

প্রশ্ন: কতগুলো পুরোনো ভার্সন আপনাকে সাপোর্ট দিতে হবে ?

যদি আপনি একবছর পর পর একটি নতুন ভার্সন আনেন তাহলে ২টি পুরোনো ভার্সন, আর ২ বছরে একটি ভার্সন আনলে ১টি বা ২টি পুরোনো ভার্সন রাখতে পারেন । তবে যদি এমন হয় যে আপনার পুরোনো এপিআইটি কেউ ব্যবহার করছে না তাহলে আপনি সাথে সাথে ডকুমেন্টেশন সহ পুরোনো এপিআই  বাতিল করে দিতে পারেন । মনে রাখতে হবে, এপিআই আপডেট নিউজ ব্যবহারকারীকে ইমেইলে নোটিফাই করতে হবে এবং নতুন ভার্সন রিলিজের পর ব্যবহারকারীকে তাদেরকে সিস্টেম আপগ্রেড করার জন্য কমপক্ষে ৬ মাস সময় দিতে হবে।

এপিআই ভার্সনিং কিভাবে করবেন?

এপিআই ভার্সনিং দুইভাবে করা যায় ।  ভার্সন ইনফরমেশন আপনি নিচের মত করে হেডারে যোগ করে রিকোয়েস্ট করতে পারেন। আপনি যদি স্ট্যান্ডার্ড হাইপারমিডিয়া ব্যবহার করতে চান তবে এটাই সবচেয়ে ভাল উপায় ।

GET /customer/123 HTTP/1.1
Accept: application/vnd.company.myapp.customer-v3+json

অথবা ভার্সন কোড সরাসরি লিংক এ জুড়ে দিতে পারেন ।

http://example.com/api/v3/posts/56

তবে কোনটা সঠিক এটা নিয়ে অনেক ভিন্ন মত আছে । ব্যাক্তিগত ভাবে আমি গুগলের এপিআই ভার্সনিং স্টাইলটাই পছন্দ করি । লিংক এ ভার্সন কোড থাকাটাই আমার কাছে বেশি ইউজার ফ্রেন্ডলি মনে হয় ।

https://www.googleapis.com/apiName/apiVersion/resourcePath?parameters

https://www.googleapis.com/blogger/v2/blogs/blogId/posts/postId
https://www.googleapis.com/blogger/v2/blogs/blogId/posts/postId/comments

ভার্সনিং বিতর্ক

এপিআই ভার্সনিং স্টাইল নিয়ে বিতর্কের শেষ নেই । কারো মতে হাইপারমিডিয়া বা কন্টেন্ট টাইপ হেডারে যুক্ত করে রিকোয়েস্ট করাটা অধিকতর যুক্তি সম্মত আবার কারো কাছে লিংক বা URI তে থাকাই ভাল । কেউ কেউ আবার দুইটা মেথড রাখা ভাল মনে করেন।

বিতর্ক মেথড
Stack Overflow 1 লিংক
Stack Overflow 2 হাইপারমিডিয়া
Stack Overflow 3 হাইপারমিডিয়া
Stack Overflow 4 হাইপারমিডিয়া
Nick Berardi on REST versioning লিংক

লিংক দিয়ে ভার্সনিং কারা করছে?

স্ট্যান্ডার্ড হিসেবে আমি যাদের কাজ কে ফলো করি তাদের বেশির ভাগই তাদের এপিআই ভার্সন কোড URI বা লংক-এ ব্যবহার করেছেন।

এপিআই উদাহরন
Twitter https://api.twitter.com/1.1/statuses/user_timeline.json
Atlassian http://host:port/context/rest/upm/1/…
Google Search https://www.googleapis.com/customsearch/v1?parameters
Facebook http://graph.facebook.com/v1.0/me
Bing Maps http://dev.virtualearth.net/REST/v1/Locations/UK/postalCode?
Delicious https://api.del.icio.us/v1/posts/update
Last FM http://ws.audioscrobbler.com/2.0/
LinkedIn http://api.linkedin.com/v1/people/~/connections
paypal https://api.paypal.com/v1/payments/orders/<Order-Id>
Tumblr api.tumblr.com/v2/user/
openstreetmap http://server/api/0.6/changeset/create
Groupon http://api.groupon.com/v2/channels//deals{.json|.xml}
Disqus https://disqus.com/api/3.0/forums/listPosts.json?forum=disqus
Drop Box https://api.dropbox.com/1/oauth/request_token
Youtube https://www.googleapis.com/youtube/v3

এপিআই ভার্সনিং নিয়ে বিতর্ক এবং রকমারি ব্যবহাররের পুরো লিস্টটি পাবেন এখানে ।

পরবর্তী পোস্ট   »  ডিজাইনিং রেস্ট এপিআই [৬] : এপিআই ডকুমেন্টেশন


মুক্ত জ্ঞান ছড়িয়ে দিন সবার মাঝে!