কোনও সংস্করণযুক্ত API এর অন্তর্নিহিত কোডবেস কীভাবে পরিচালনা করবেন?


107

আমি আরএসটি এপিআইয়ের সংস্করণ কৌশলগুলি পড়ছি এবং এর মধ্যে যেটির কোনওটিই দেখা যাচ্ছে না তা হ'ল আপনি অন্তর্নিহিত কোডবেস কীভাবে পরিচালনা করেন।

ধরা যাক আমরা একটি এপিআই-তে কিছু ভাঙ্গা পরিবর্তন করছি - উদাহরণস্বরূপ, আমাদের গ্রাহক সংস্থান পরিবর্তন করা যাতে এটি একক ক্ষেত্রের পরিবর্তে পৃথক forenameএবং surnameক্ষেত্রগুলি nameদেয়। (এই উদাহরণস্বরূপ, আমি ইউআরএল সংস্করণ সমাধানটি ব্যবহার করব যেহেতু জড়িত ধারণাগুলি বোঝা সহজ তবে প্রশ্নটি বিষয়বস্তু আলোচনার বা কাস্টম এইচটিটিপি শিরোনামগুলির ক্ষেত্রেও সমানভাবে প্রযোজ্য)

আমাদের এখন একটি এন্ডপয়েন্ট রয়েছে http://api.mycompany.com/v1/customers/{id}এবং এটিতে অন্য একটি বেমানান শেষ পয়েন্ট রয়েছে http://api.mycompany.com/v2/customers/{id}। আমরা এখনও ভি 1 এপি-তে বাগফিক্স এবং সুরক্ষা আপডেটগুলি প্রকাশ করছি, তবে নতুন বৈশিষ্ট্য বিকাশ এখন সমস্ত ভি 2-তে ফোকাস করছে। আমরা কীভাবে আমাদের এপিআই সার্ভারে পরিবর্তনগুলি লিখি, পরীক্ষা করি এবং স্থাপন করি? আমি কমপক্ষে দুটি সমাধান দেখতে পাচ্ছি:

  • ভি 1 কোডবেসের জন্য উত্স নিয়ন্ত্রণ শাখা / ট্যাগ ব্যবহার করুন। v1 এবং v2 বিকশিত হয়, এবং স্বাধীনভাবে স্থাপন করা হয়, উভয় সংস্করণে একই বাগফিক্স প্রয়োগ করার জন্য প্রয়োজনীয় হিসাবে পুনর্বিবেচনা নিয়ন্ত্রণ সংহতকরণের সাথে ব্যবহৃত হয় - যেমনটি পূর্ববর্তী সংস্করণটিকে সমর্থন করে যখন কোনও নতুন নতুন সংস্করণ বিকাশ করার সময় আপনি কীভাবে দেশীয় অ্যাপ্লিকেশনগুলির জন্য কোডবেসগুলি পরিচালনা করতে পারেন তার অনুরূপ।

  • কোডবেসকে নিজেই API সংস্করণ সম্পর্কে সচেতন করুন, সুতরাং আপনার একক কোডবেস সমাপ্ত হবে যাতে এতে ভি 1 গ্রাহকের উপস্থাপনা এবং ভি 2 গ্রাহকের প্রতিনিধিত্ব উভয়ই অন্তর্ভুক্ত রয়েছে। কোনও ডিপ্লোয়মেন্ট ইস্যুটির পরিবর্তে আপনার সমাধান আর্কিটেকচারের অংশ হিসাবে সংস্করণটির ব্যবহার করুন - সম্ভবত অনুরোধগুলি সঠিক সংস্করণ দ্বারা পরিচালিত হয়েছে তা নিশ্চিত করে নেমস্পেসের কিছু সংমিশ্রণ এবং রাউটিং ব্যবহার করে।

ব্রাঞ্চ মডেলটির সুস্পষ্ট সুবিধা হ'ল এটি পুরানো এপিআই সংস্করণগুলি মুছতে তুচ্ছ - কেবল উপযুক্ত শাখা / ট্যাগ মোতায়েন করা বন্ধ করুন - তবে আপনি যদি বেশ কয়েকটি সংস্করণ চালাচ্ছেন তবে আপনি সত্যিই সংশ্লেষিত শাখা কাঠামো এবং স্থাপনার পাইপলাইনটি দিয়ে শেষ করতে পারেন। "ইউনিফাইড কোডবেস" মডেলটি এই সমস্যাটিকে এড়িয়ে চলে, তবে (আমি মনে করি?) কোডবেস থেকে অবহেলিত সংস্থান এবং শেষের অবস্থানগুলি যখন আর প্রয়োজন হয় না তখন তাদের সরিয়ে নেওয়া আরও শক্ত করে তোলে। আমি জানি এটি সম্ভবত সাবজেক্টিভ কারণ যেহেতু সাধারণ সঠিক উত্তর হওয়ার সম্ভাবনা নেই, তবে আমি বুঝতে আগ্রহী যে সংস্থাগুলি যারা একাধিক সংস্করণ জুড়ে জটিল এপিআইগুলি বজায় রাখে তারা কীভাবে এই সমস্যা সমাধান করছে solving


41
এই প্রশ্ন জিজ্ঞাসা করার জন্য ধন্যবাদ! আমি বিশ্বাস করি না আরও বেশি লোক এই প্রশ্নের উত্তর দিচ্ছে না !! সংস্করণগুলি কোনও সিস্টেমে কীভাবে প্রবেশ করে সে সম্পর্কে আমি সবার মতামত নিয়ে অসুস্থ এবং ক্লান্ত হয়ে পড়েছি, তবে তাদের উপযুক্ত কোডটিতে সংস্করণ প্রেরণের আসল কঠিন সমস্যাটিকে কেউ মোকাবেলা করতে পারে বলে মনে হয় না। আপাতত এই আপাতদৃষ্টিতে সাধারণ সমস্যার স্বল্পতম গ্রহণযোগ্য "নিদর্শন" বা "সমাধান" এর একটি অ্যারে থাকা উচিত। "এপিআই সংস্করণ" সম্পর্কিত এসও-তে একটি উন্মাদ সংখ্যার প্রশ্ন রয়েছে। সংস্করণগুলি কীভাবে গ্রহণ করবেন সে সিদ্ধান্ত নেওয়া ফ্রিকিন সিম্পল (তুলনামূলকভাবে)! এটি একবারে প্রবেশের পরে কোডবেজে হ্যান্ডলিং করা কি খুব শক্ত!
অরিজিৎ

উত্তর:


46

আপনার উল্লিখিত কৌশলগুলি আমি উভয়ই ব্যবহার করেছি। এই দু'জনের মধ্যে, আমি দ্বিতীয় পদ্ধতির পক্ষে, সহজতর, ব্যবহারের ক্ষেত্রে এটি সমর্থন করে favor এটি হ'ল, যদি সংস্করণটির প্রয়োজনীয়তাগুলি সহজ হয়, তবে একটি সহজ সফ্টওয়্যার নকশা নিয়ে যান:

  • স্বল্প সংখ্যক পরিবর্তন, কম জটিলতা পরিবর্তন বা কম ফ্রিকোয়েন্সি পরিবর্তনের শিডিয়ুল
  • কোডবেসের বাকী অংশগুলিতে মূলত orthogonal এমন পরিবর্তনগুলি: "অতিরিক্ত" (আপনি যে শব্দটির যে কোনও সংজ্ঞা গ্রহণের জন্য বেছে নিতে চান) কোডের শাখা ছাড়াই পাবলিক এপিআই বাকি স্ট্যাকের সাথে শান্তিপূর্ণভাবে উপস্থিত থাকতে পারে code

এই মডেলটি ব্যবহার করে অবজ্ঞাপিত সংস্করণগুলি অপসারণ করা অত্যধিক কঠিন মনে হয়নি:

  • ভাল পরীক্ষার কভারেজের অর্থ হ'ল একটি অবসরপ্রাপ্ত এপিআই এবং সম্পর্কিত ব্যাকিং কোডটি কোনও (ভাল, ন্যূনতম) নিবন্ধগুলি নিশ্চিত করেছে
  • নামকরণের ভাল কৌশল (এপিআই-সংস্করণযুক্ত প্যাকেজের নাম, বা পদ্ধতিতে কিছুটা কুশলী, এপিআই সংস্করণ) প্রাসঙ্গিক কোডটি সনাক্ত করা সহজ করে তুলেছে
  • ক্রস কাটিয়া উদ্বেগগুলি আরও শক্ত; একাধিক এপিআই সমর্থন করার জন্য মূল ব্যাকএন্ড সিস্টেমে পরিবর্তনগুলি খুব সাবধানে ওজন করতে হবে। এক পর্যায়ে, সংস্করণীয় ব্যাকএন্ডের ব্যয় (উপরে "অত্যধিক" বিষয়ে মন্তব্য দেখুন) একক কোডবেজের সুবিধা ছাড়িয়ে যায়।

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

তৃতীয় পন্থাটি আর্কিটেকচারাল স্তরে রয়েছে: ফ্যাকেড প্যাটার্নের একটি বৈকল্পিক গ্রহণ করুন, এবং আপনার এপিআইগুলিকে জনসাধারণের মুখোমুখি, সংস্করণযুক্ত স্তরগুলিতে বিমূর্ত করুন যা যথাযথ ফ্যাসাদে উদাহরণটিতে কথা বলে, যার ফলে এপিআইগুলির নিজস্ব সেটের মাধ্যমে ব্যাকএন্ডে আলাপ হয়। আপনার মুখোমুখি (আমি আমার পূর্ববর্তী প্রকল্পে একটি অ্যাডাপ্টার ব্যবহার করেছি) এর নিজস্ব প্যাকেজ হয়ে যায়, স্ব-অন্তর্ভুক্ত এবং পরীক্ষাযোগ্য এবং আপনাকে ব্যাকএন্ড এবং একে অপরের স্বতন্ত্রভাবে ফ্রন্টএন্ড এপিআই স্থানান্তর করতে দেয়।

আপনার এপিআই সংস্করণগুলি যদি একই ধরণের সংস্থানগুলি প্রকাশ করে তবে আপনার পুরো নাম / পূর্ব নাম / উপাধির উদাহরণ হিসাবে বিভিন্ন কাঠামোগত উপস্থাপনা সহ এটি কাজ করবে। যদি তারা বিভিন্ন ব্যাকএন্ড গণনার উপর নির্ভর করা শুরু করে তবে এটি কিছুটা শক্ত হয়ে যায়, যেমন রয়েছে, "আমার ব্যাকএন্ড পরিষেবাটি জনসাধারণের API v1-তে প্রকাশিত ভুল গণনা করা যৌগিক সুদ ফিরিয়ে দিয়েছে Our আমাদের গ্রাহকরা ইতিমধ্যে এই ভুল আচরণকে প্যাচ করেছেন Therefore সুতরাং, আমি আপডেট করতে পারি না যে ব্যাকএন্ডে গণনা এবং এটি ভি 2 অবধি প্রয়োগ করা উচিত Therefore সুতরাং এখন আমাদের সুদের গণনা কোডটি কাঁটাচামচ করা দরকার "" ভাগ্যক্রমে, এগুলি খুব কমই থাকে: ব্যবহারিকভাবে বলতে গেলে, RESTful APIs এর গ্রাহকরা তাত্ত্বিকভাবে আদর্শবাদী GETটেড সংস্থার উপর নির্ভরযোগ্য পরিবর্তন না করে এমনকি বাগ-ফর-বাগের পিছনে সামঞ্জস্যের তুলনায় যথাযথ উত্সের উপস্থাপনাকে সমর্থন করে।

আমি আপনার শেষ সিদ্ধান্ত শুনতে আগ্রহী।


4
উত্স কোডটিতে কেবল কৌতুহলী, আপনি কি ভি0 এবং ভি 1 এর মধ্যে মডেলগুলি নকল করেন যা পরিবর্তিত হয়নি? অথবা আপনার কি ভি 1 এর কিছু ভি0 মডেল ব্যবহার রয়েছে? আমার কাছে, আমি যদি কিছু ক্ষেত্রের জন্য ভি 1 মডেল ব্যবহার করে ভি 1 দেখি তবে আমি বিভ্রান্ত হব। তবে অন্যদিকে, এটি কোড ব্লাটকে হ্রাস করবে। একাধিক সংস্করণ হ্যান্ডলিংয়ের জন্য আমাদের কী কখনও মেনে নেওয়া এবং কখনও পরিবর্তন হয়নি এমন মডেলগুলির জন্য সদৃশ কোড সহ বাঁচতে হবে?
এজক্যাসবার্গ

4
আমার স্মরণশক্তিটি হ'ল আমাদের উত্স কোড সংস্করণিত মডেলগুলি পৃথক পৃথকভাবে API এআইপিএল, সুতরাং উদাহরণস্বরূপ API v1 মডেল V1 ব্যবহার করতে পারে এবং API v2 মডেল ভি 1 ব্যবহার করতে পারে। মূলত, পাবলিক এপিআইয়ের অভ্যন্তরীণ নির্ভরতা গ্রাফটি উভয়ই উন্মুক্ত এপিআই কোড এবং সেই সাথে সার্ভার এবং মডেল কোডের মতো ব্যাকএন্ড "পরিপূর্ণতা" কোড অন্তর্ভুক্ত করে। একাধিক সংস্করণের জন্য, আমি একমাত্র কৌশলটি ব্যবহার করেছি পুরো স্ট্যাকের সদৃশ - একটি সংকর পদ্ধতির (মডিউল এটিকে নকল করা হয়েছে, মডিউল বি রূপান্তরিত করা হয়েছে ...) খুব বিভ্রান্তিকর বলে মনে হচ্ছে। অবশ্যই ওয়াইএমএমভি। :)
পালপাতিম

4
আমি নিশ্চিত না যে আমি তৃতীয় পদ্ধতির জন্য প্রস্তাবিত যা তা অনুসরণ করি। কোডের মতো এমন কোনও সার্বজনীন উদাহরণ রয়েছে যা এর মতো কাঠামোযুক্ত?
এহতেশ চৌধুরী

13

আমার জন্য দ্বিতীয় পদ্ধতির ভাল। আমি এটি এসওএপি ওয়েব পরিষেবাদির জন্য ব্যবহার করেছি এবং এটি আরইএসটি-র জন্যও ব্যবহার করার পরিকল্পনা করছি।

আপনি যেমন লিখবেন, কোডবেসটি সংস্করণ সচেতন হওয়া উচিত, তবে একটি সামঞ্জস্যতা স্তরটি পৃথক স্তর হিসাবে ব্যবহার করা যেতে পারে। আপনার উদাহরণে, কোডবেস প্রথম এবং শেষ নাম দিয়ে রিসোর্স রিপ্রেজেন্টেশন (জেএসওএন বা এক্সএমএল) উত্পাদন করতে পারে তবে সামঞ্জস্যতা স্তরটি পরিবর্তে এটি কেবল নাম হিসাবে পরিবর্তন করবে।

কোডবেসটি কেবল সর্বশেষতম সংস্করণটি প্রয়োগ করা উচিত, বলুন v3। সামঞ্জস্যতা স্তরটি নতুন সংস্করণ v3 এবং সমর্থিত সংস্করণগুলি যেমন v1 এবং v2 এর মধ্যে অনুরোধ এবং প্রতিক্রিয়াটিকে রূপান্তর করবে। সামঞ্জস্যতা স্তরটিতে প্রতিটি সমর্থিত সংস্করণের জন্য পৃথক অ্যাডাপ্টার থাকতে পারে যা চেইন হিসাবে সংযুক্ত হতে পারে।

উদাহরণ স্বরূপ:

ক্লায়েন্ট ভি 1 অনুরোধ: v1 v2 -> v2 সাথে V3 ----> কোডবেসে অভিযোজিত apt

ক্লায়েন্ট ভি 2 এর অনুরোধ: ভি 1 ভি 2-এর সাথে মানিয়ে নিন (এড়িয়ে যান) ---> ভি 2 ভি 3 ----> কোডবেসে মানিয়ে নিন

প্রতিক্রিয়ার জন্য অ্যাডাপ্টারগুলি কেবল বিপরীত দিকে কাজ করে। আপনি যদি জাভা ইই ব্যবহার করে থাকেন তবে উদাহরণস্বরূপ আপনি অ্যাডাপ্টার চেইন হিসাবে সার্লেলেট ফিল্টার চেইন করতে পারেন।

একটি সংস্করণ অপসারণ করা সহজ, সংশ্লিষ্ট অ্যাডাপ্টার এবং পরীক্ষার কোড মুছুন।


সম্পূর্ণ অন্তর্নিহিত কোড বেসটি পরিবর্তিত হলে সামঞ্জস্যতার গ্যারান্টি দেওয়া কঠিন। বাগ-ফিক্স রিলিজের জন্য পুরানো কোডবেস ধরে রাখতে আরও বেশি নিরাপদ।
মার্সেলো ক্যান্টোস

5

ব্রাঞ্চিং আমার পক্ষে অনেক ভাল বলে মনে হচ্ছে এবং আমি আমার ক্ষেত্রে এই পদ্ধতির ব্যবহার করেছি।

হ্যাঁ আপনি ইতিমধ্যে উল্লেখ করেছেন - ব্যাকপোর্টিং বাগ ফিক্সগুলির জন্য কিছু প্রচেষ্টা প্রয়োজন তবে একই সময়ে এক উত্স ভিত্তিতে একাধিক সংস্করণকে সমর্থন করা (রাউটিং এবং অন্যান্য সমস্ত জিনিস সহ) আপনার প্রয়োজন কম না হলেও কমপক্ষে একই প্রচেষ্টা, সিস্টেমকে আরও তৈরি করা প্রয়োজন ভিতরে যুক্তির বিভিন্ন শাখাসমূহ সহ জটিল এবং রাক্ষসী (সংস্করণ দেওয়ার সময় আপনাকে সংজ্ঞায়িতভাবে case()কোড ডুপ্লিকেটযুক্ত সংস্করণ মডিউলগুলিতে বিশাল পয়েন্টিংয়ে আসবে , বা আরও খারাপ হবে)if(version == 2) then... )। এছাড়াও ভুলে যাবেন না যে প্রতিরোধের উদ্দেশ্যে আপনাকে এখনও পরীক্ষাগুলি ব্রাঞ্চ রাখতে হবে।

সংস্করণ নীতি সম্পর্কিত: আমি বর্তমান থেকে সর্বাধিক -2 সংস্করণ হিসাবে রাখব, পুরানোগুলির জন্য সমর্থনকে হ্রাস করে - যা ব্যবহারকারীদের চলতে কিছুটা অনুপ্রেরণা জোগাবে।


আমি এই মুহুর্তে একটি একক কোডবেসে পরীক্ষার কথা ভাবছি। আপনি উল্লেখ করেছেন যে পরীক্ষাগুলি সর্বদা ব্রাঞ্চ করা দরকার তবে আমি ভেবেছি যে ভি 1, ভি 2, ভি 3 ইত্যাদির জন্য সমস্ত পরীক্ষাগুলিও একই সমাধানে থাকতে পারে এবং সমস্ত একই সময়ে চালানো যেতে পারে। আমি বৈশিষ্ট্যাবলী সঙ্গে পরীক্ষা শোভাকর তারা যা সংস্করণ সমর্থন নির্দিষ্ট করে চিন্তা করছি: যেমন [Version(From="v1", To="v2")], [Version(From="v2", To="v3")], [Version(From="v1")] // All versions শুধু এটা এখন অন্বেষণ, কখনও কাউকে একথা শুনে না?
লি গন

4
ঠিক আছে, 3 বছর পরে আমি শিখেছি যে মূল প্রশ্নের সঠিক কোনও উত্তর নেই: ডি। এটি খুব প্রকল্প নির্ভর is আপনি যদি এপিআই হিমাঙ্কের সামর্থ্য রাখেন এবং কেবল এটি বজায় রাখতে পারেন (উদাহরণস্বরূপ বাগফিক্স) তবে আমি এখনও সম্পর্কিত কোডটি শাখা / বিচ্ছিন্ন করবো (এপিআই-সম্পর্কিত ব্যবসায়িক যুক্তি + পরীক্ষা + বিশ্রামের সমাপ্তি) এবং পৃথক লাইব্রেরিতে সমস্ত ভাগ করা জিনিস (তার নিজস্ব পরীক্ষা দিয়ে) )। যদি ভি 1 বেশ কিছু সময়ের জন্য ভি 2 এর সাথে সহাবস্থান করতে চলেছে এবং বৈশিষ্ট্যটির কাজ এখনও অব্যাহত থাকে তবে আমি তাদের একসাথে রাখি এবং পরীক্ষাগুলিও রাখি (ভি 1, ভি 2 ইত্যাদি coveringেকে রেখে সে অনুসারে নামকরণ করেছি)।
এডমারিসভ

4
ধন্যবাদ হ্যাঁ, এটি বেশ মতামতযুক্ত স্থান বলে মনে হচ্ছে। আমি প্রথমে একটি সমাধান পদ্ধতির চেষ্টা করতে যাচ্ছি এবং দেখুন এটি কীভাবে চলে।
লি গন

0

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.