REST কেবলমাত্র আশাবাদী সম্মতি নিয়ন্ত্রণের মধ্যে সীমাবদ্ধ?


9

প্রসঙ্গ

বিশ্রামের আর্কিটেকচারাল স্টাইলের স্থবিরতার কারণে যে প্রতিটি অনুরোধ সম্পূর্ণ একা দাঁড়িয়ে থাকে, যার ফলে সার্ভার ক্লায়েন্ট সম্পর্কে কোনও তথ্য সংরক্ষণ করে না।

সুতরাং, হতাশাবাদী একচেটিয়া নিয়ন্ত্রণ উপযুক্ত নয় কারণ এর জন্য সেই সার্ভার স্টোরের প্রয়োজন হবে যা ক্লায়েন্ট কোনও সংস্থানটিতে লক পায়। আশাবাদী সম্মতি নিয়ন্ত্রণটি তখন Etagশিরোলেখের সাহায্যে ব্যবহার করা হয় । (বিটিডব্লিউ, যেমন আমি সেখানে জিজ্ঞাসা করেছি /programming/30080634/concurrency-in-a-rest-api )

সমস্যা

একটি আশাবাদী সম্মতি নিয়ন্ত্রণ ব্যবস্থাটি সহ প্রধান সমস্যাটি হ'ল আপনি যে কোনও ক্রিয়াকলাপ চালানোর জন্য সর্বদা, সমস্ত ক্লায়েন্টকে অনুমতি দিন।

এবং আমি এটিকে রেস্টের রাষ্ট্রহীনতার নীতিটি ভঙ্গ না করে এড়াতে চাই। আমি বোঝাতে চাইছি যে সমস্ত ক্লায়েন্টরা কোনও সময়ে কোনও ক্রিয়াকলাপ করতে পারে না।

প্রশ্ন

আমার মনে, এটি যেমন একটি আধা-আশাবাদী সম্মতি নিয়ন্ত্রণ ব্যবস্থা দিয়ে সম্ভব হবে :

  • ক্লায়েন্টরা একটি টোকেনের জন্য অনুরোধ করতে পারে
  • কেবলমাত্র একটি টোকেন উত্পন্ন হতে পারে এবং এর মেয়াদ সীমিত রয়েছে
  • সংস্থানসমূহ (যেমন POST বা PUT ) এ অপারেশন করার জন্য , ক্লায়েন্টকে অনুরোধের শরীরের (বা শিরক?) অংশ হিসাবে অবশ্যই এই টোকেন দিতে হবে। টোকেন নেই এমন ক্লায়েন্ট এই ক্রিয়াকলাপগুলি করতে পারে না।

এটি আশাবাদী সমঝোতা নিয়ন্ত্রণের সাথে খুব মিল, কেবলমাত্র একজন ক্লায়েন্ট কিছু অপারেশন করতে পারে (যেটি টোকেন পেয়েছিল) ... "সমস্ত ক্লায়েন্ট সমস্ত ক্রিয়াকলাপ করতে পারে" এর বিপরীতে।

এই প্রক্রিয়াটি কি কোনও বিশ্রামের স্থাপত্য শৈলীর সাথে সামঞ্জস্যপূর্ণ? এটি কি তার কোনও বাধা ভঙ্গ করে? আমি এসও জিজ্ঞাসা করার জন্য ভাবছিলাম, তবে এটি সফ্টওয়্যার ডিজাইনের সাথে সম্পর্কিত, একটি উচ্চ-স্তরের প্রশ্ন বলে মনে হচ্ছে।


1
এটি বরং সহজ, আসলে: আপনাকে একটি Transactionউত্স হিসাবে স্পষ্টভাবে মডেল করতে হবে ।
Jörg ডব্লু মিটাগ

এতে কী পরিবর্তন হয়? আপনার মন্তব্য বুঝতে নিশ্চিত না। আমি লেনদেনের জন্য একচেটিয়া নিয়ন্ত্রণ করছি না, বরং ক্লায়েন্টকে বলার জন্য "ঠিক আছে এখন, আপনি অবশ্যই নিশ্চিত যে কেউ এই সংস্থান পরিবর্তন করবে না" (এটি একটি অনন্য টোকেন পেয়েছে)।
আইলিউরাসফুলজেনস

1
পার্থক্য কি? একদিকে আপনি চেক করতে ইটাগ ব্যবহার করেন, "কারেন্ট" সংস্করণ আপডেট করার জন্য কাকে অনুমতি দেওয়া হয়েছে; যদি এটি সংঘর্ষ হয়, আপনাকে নিজের সংস্করণ আপডেট করতে হবে এবং তার পরে আপডেটটি করতে হবে। অন্যদিকে, আপনার কাছে আপনার "লকিং" প্রক্রিয়া রয়েছে: একজনকে অনুমতি দেওয়া হয়েছে, অন্যকে অপেক্ষা করতে হবে। বেশ সুন্দর লাগছে। দ্বিতীয় পদ্ধতির ক্ষতি - 2 টি অনুরোধ - লকের জন্য 1 এবং আপডেটের জন্য 1 the একটি অনুকূল ক্ষেত্রে, আপনার ইটাগ-পদ্ধতির মাধ্যমে কেবলমাত্র একটি আপডেট রয়েছে।
থমাস জাঙ্ক

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

উত্তর:


3

ব্যবহারকারীর মিথস্ক্রিয়াটির জন্য অপেক্ষা করার সময় আপনার কখনই (কখনও কখনও কখনও কখনও) কোনও সংস্থান লক করা উচিত নয়।

কিছু সময়ে আপনার কিছু ব্যবহারকারী দীর্ঘ উইকএন্ডে কিছু গুরুত্বপূর্ণ রেকর্ডকে লক করে রেখে যাবেন।

আহ তবে আপনি এটি হতে দেবেন না কারণ আপনার কাছে কিছু চতুর সময় / অচলাবস্থা সমাধানের স্কিম রয়েছে; তারপরে কোনও এক সময় এটি মারাত্মক ভুল হয়ে যাবে এবং কোনও ব্যবহারকারী যিনি একটি "আপনার উইজেটের আদেশ দেওয়া হয়েছে" একটি দুর্দান্ত বার্তা পেয়েছে তার উইজেট কেন বিতরণ করা হয়নি তা জানতে হেল্প ডেস্কে চিৎকার করবে।

বেশিরভাগ লোক "দুঃখিত, অন্য ব্যবহারকারী সবে এই অংশটি অর্ডার করেছেন" বার্তাটি দিয়ে মোকাবেলা করতে পারে।


আপনি এটি সুন্দরভাবে ব্যাখ্যা করেছেন। যদিও আমি আপনার প্রথম বাক্যে সম্পূর্ণরূপে নিশ্চিত নই: এক পর্যায়ে আপনি নিশ্চয়তা দিবেন যে আপনি ছাড়া আর কেউ অর্ডার করতে পারবেন না। তবে ভাল, আপনার শেষ বাক্যটি একটি ভাল সংক্ষিপ্তসার, 99% ক্ষেত্রে ক্ষেত্রে এটি হয়।
আইলিউরাসফুলজেনস 21

1
আপনার যদি কোনও নির্দিষ্ট ব্যবহারকারীর জন্য কোনও রেকর্ড লক করতে হয় তবে তা আবেদন পর্যায়ে করুন। হয় একটি সাধারণ "লকডবি" বৈশিষ্ট্য হবে, বা আরও কিছু পরিশীলিত সংস্করণ এবং ওয়ার্কফ্লো প্রক্রিয়া রয়েছে।
জেমস অ্যান্ডারসন

"অ্যাপ্লিকেশন পর্যায়ে" বলতে কী বোঝ? আপনি যদি আপনার সংস্থানটিতে একটি "লকডবি" বৈশিষ্ট্য যুক্ত করেন, তবে আপনি নিজের সার্ভারে ক্লায়েন্ট সম্পর্কে তথ্য সঞ্চয় করেন। অথবা হয়তো আমি আপনার মন্তব্য বুঝতে পারি নি। আপনি যদি কিছু বিশদ সরবরাহ করতে পারেন তবে দুর্দান্ত হবে!
আইলুরুসফুলজেনস

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

2

এপিআইগুলিতে টোকেন ব্যবহার করা খুব সাধারণ, এই টোকেনগুলি সাধারণত শিরোনাম হিসাবে প্রেরণ করা হয় এবং একটি সুস্পষ্ট জীবনচক্র রয়েছে। উদাহরণস্বরূপ OAuth মনে করুন Think

আপনার প্রোগ্রামিং ভাষা বা কাঠামো নির্বিশেষে, REST এপিআই একই রকম।

আমি একাধিক দৃশ্যের কথা ভাবতে পারি যেখানে আপনি একযোগে সীমাবদ্ধ রাখতে চান, এর মধ্যে দুটি হল:

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

  2. একজন সুপার ব্যবহারকারী বা প্রশাসক যা এপিআই দিয়ে বিশেষ ক্রিয়া করে।


এই ক্ষেত্রে কী করবেন?

  1. সংস্থানসমূহের অ্যাক্সেসকে সিঙ্ক্রোনাইজ করতে ডাটাবেস, সিলেটলেটস, লক এবং অনুরূপ পদ্ধতিতে লেনদেনগুলি ব্যবহার করুন।

  2. টোকেনটি কার্যকর হতে পারে, আমি মনে করি আপনি ক্লায়েন্ট সম্পর্কে কেবলমাত্র টোকেন সম্পর্কে তথ্য সংরক্ষণ না করলে এটি আরও ভাল হবে। এক ধাপে আপনি ব্যবহারকারীকে বৈধতা দিতে এবং টোকেন বরাদ্দ করতে পারেন। তারপরে কেবল বৈধতা দিন যে টোকেনটি জীবিত এবং বৈধ। একটি টোকেন ব্যবহার করুন যা অতিরিক্ত তথ্য পাওয়ার জন্য ডিক্রিপ্ট করা যেতে পারে। এটি যদি বিশেষ টোকেন হয় তবে আপনি সঞ্চয় করতে পারেন এবং একসাথে কেবল অনুমতি দেওয়া। এইভাবে আপনি টোকেনটি বৈধ করেছেন, ব্যবহারকারীর নয়।

আশা করি এটা কাজে লাগবে.


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

আমি কি আপনার প্রশ্নের উত্তর দিয়েছি?
পাবলো গ্রানাডোস

না দুঃখিত। আমি আপনার উত্তরটিকে উঁচু করে তুলেছি কারণ এটি সমস্যার একটি ভাল ওভারভিউ দেয় তবে দুর্ভাগ্যক্রমে, কিন্তু, এটি সত্যিই এটি মোকাবেলা করছে না।
আইলিউরাসফুলজেনস

0

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

(১) https://stackoverflow.com/a/3921423/471129 এর জন্য এখানে দেখুন , এবং,

এখানে এবং (2) https://stackoverflow.com/a/21939972/471129 এর জন্য দেখুন

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