একটি বিতরণ লকিং প্যাটার্ন খুঁজছেন


10

সি # তে বিতরণ করা সিস্টেমের জন্য আমাকে একটি কাস্টম রিকার্সিভ অবজেক্ট লকিং মেকানিজম-প্যাটার্ন নিয়ে আসতে হবে। মূলত, আমার কাছে একটি মাল্টি-নোড সিস্টেম রয়েছে। প্রতিটি নোডের হয়েছে একচেটিয়া লেখার উপর অনুমতি এন রাষ্ট্রের -number টুকরা। একই রাষ্ট্রটি কমপক্ষে অন্য একটি নোডে কেবল পঠনযোগ্য ফর্মে উপলব্ধ । কিছু লেখক / আপডেটগুলি অবশ্যই সমস্ত নোডের পারমাণবিক হতে হবে, অন্য আপডেটগুলি শেষ পর্যন্ত পটভূমি প্রতিলিপি প্রক্রিয়া, সারি ইত্যাদির মাধ্যমে সুসংগত হয়ে উঠবে ...

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

লেনদেন বা বার্তা বার্তা এই প্রশ্নের কেন্দ্রবিন্দু নয়, তবে আমি এগুলি কিছু অতিরিক্ত প্রসঙ্গের জন্য সরবরাহ করেছি। এই কথাটি বলে, আপনি যদি চান তবে কোন বার্তাগুলির প্রয়োজন হবে তা নির্দ্বিধায় নির্দ্বিধায় করুন।

এখানে আমি কী ভাবছিলাম তার একটি অস্পষ্ট নমুনা যদিও আমি সম্পূর্ণ নতুন পণ্য বাস্তবায়ন বাদ দিয়ে কোনও নতুন ধারণার জন্য উন্মুক্ত

thing.AquireLock(LockLevel.Write);

//Do work

thing.ReleaseLock();

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

public static void AquireLock(this IThing instance, TupleLockLevel lockLevel)
{ 
    //TODO: Add aquisition wait, retry, recursion count, timeout support, etc...  
    //TODO: Disallow read lock requests if the 'thing' is already write locked
    //TODO: Throw exception when aquisition fails
    instance.Lock = lockLevel;
}

public static void ReleaseLock(this IThing instance)
{
    instance.Lock = TupleLockLevel.None;
}

কয়েকটি বিবরণ স্পষ্ট করতে ...

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

কারও কোন পরামর্শ আছে?


লকগুলি সাধারণত বেশিরভাগ সিস্টেমে একটি স্ট্যান্ডার্ড বৈশিষ্ট্য। আমার ধারণা এটি সি # তেও আছে। (একটি গুগল অনুসন্ধানের ফলাফল: albahari.com/threading/part2.aspx ) আপনি কি বেসিক মুটেক্স বা সেমোফোরের বাইরে কিছু অর্জন করার চেষ্টা করছেন?
দিপান মেহতা

2
@ দিপনমহেতা দুঃখিত, আমার এটিকে আরও স্পষ্টভাবে সম্বোধন করা উচিত ছিল। নোড আমি উল্লেখ একটি নেটওয়ার্কে যন্ত্র। Mutex এবং Semaphores সম্পর্কে আমার বোঝা হ'ল তারা মেশিন-প্রশস্ত লক ( যেমন ক্রস প্রক্রিয়া ) এবং কোনও লক নয় যা কোনও নেটওয়ার্কের মেশিনগুলির মধ্যে প্রসারিত করতে পারে।
জোজিকি

@ জোজিকি আপনার প্রশ্নটি এখানে অনন্য-বিষয় এবং সম্ভবত স্ট্যাক ওভারফ্লোর জন্য খুব তাত্ত্বিক হবে । আপনি যদি সেখানে এটি আবার জিজ্ঞাসা করতে চান তবে আপনি আরও কোড-কেন্দ্রীকৃত ফ্রেসিং চাইবেন।
অ্যাডাম শিখুন

উত্তর:


4

স্পষ্টতার জন্য ধন্যবাদ।

সেক্ষেত্রে আমি যা সুপারিশ করব তা হ'ল একটি প্রকাশ / সাবস্ক্রাইব মডেল ব্যবহার করা। গুগলের নিবিষ্টভাবে বিতরণ করা লকিং প্রোটোকল ( প্যাকসগুলির বাস্তবায়ন )

আমি Paxos (অথবা নিটোল) ব্যবহার করেছি না, কিন্তু সেখানে একটি ওপেন সোর্স বাস্তবায়ন হবে বলে মনে হয় এখানে

যদি এটি কাজ না করে, আপনি প্যাকসগুলির নিজস্ব সংস্করণ ব্যবহার করে প্রয়োগ করতে পারেন, উদাহরণস্বরূপ, মেসেজিং লাইব্রেরিগুলির ক্ষেত্রে সাধারণ সন্দেহভাজনদের মধ্যে একটি: শূন্য বার্তা সারি লাইব্রেরি , রাব্বিটএমকিউ বা অ্যাক্টিভ এমকিউ


পূর্ববর্তী উত্তর:

এসও ( [এ] , [বি] ) এর বেশিরভাগ পরামর্শ ক্রস-মেশিন লকিংয়ের জন্য বার্তা সারি ব্যবহার করার জন্য যায়।

AcquireLockসাফল্যের আগে লকগুলির পূর্ববর্তী দৃষ্টান্তগুলি পরীক্ষা করে আপনার পদ্ধতিটি কাতারে লক অবজেক্ট সনাক্ত করার জন্য কিছু চাপ দেবে। আপনার ReleaseLockপদ্ধতিটি সারি থেকে লক অবজেক্টটি সরিয়ে ফেলবে।

তাই ব্যবহারকারী অ্যাটলান্টিস প্রস্তাব দেওয়া হয়, এই পোস্টে , জেফ কী এর পোস্ট বিস্তারিত কিছু।


ধন্যবাদ, তবে এই সমাধানগুলি উপযুক্ত হবে না কারণ আমার কাছে কেন্দ্রীয় মাস্টার, ডাটাবেস বা সারি নেই ue আমি এই বিবরণটির কিছু স্পষ্ট করতে কিছু অতিরিক্ত বিবরণ দিয়ে প্রশ্ন আপডেট করেছি।
জোজিকি

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

@ জোজিকি হ্যাঁ, প্যাকসোস লিঙ্কটিতে সিক্যুয়েন্স ডায়াগ্রাম রয়েছে যা আপনাকে এটি আপনার পছন্দসই যোগাযোগের লিঙ্কটি ব্যবহার করে বাস্তবায়নের অনুমতি দিতে পারে।
পিটার কে।

সরাসরি উত্তর না হলেও, সমস্ত নিবিড় এবং প্যাকসোস স্টাফ পড়ে আমার নিজের সমাধানটি সংজ্ঞায়িত করতে সহায়তা করেছে। আমি এই সরঞ্জামগুলি ব্যবহার করি নি, তবে তাদের কিছু ধারণার উপর ভিত্তি করে যুক্তিসঙ্গত প্যাটার্নটি সংজ্ঞায়িত করতে সক্ষম হয়েছি। ধন্যবাদ।
জোজিকি

@ জোজিকি: শুনে শুনে ভাল লাগলো যে এটি কিছুটা হলেও সাহায্য করেছিল। টিকের জন্য ধন্যবাদ।
পিটার কে।

4

আমার কাছে মনে হচ্ছে আপনার কাছে বেশ কয়েকটি মিশ্র প্রযুক্তি রয়েছে:

  • যোগাযোগ (যা আপনি মূলত 100% নির্ভরযোগ্য হিসাবে নির্ভর করেন ... যা মারাত্মক হতে পারে)

  • লকিং / পারস্পরিক বর্জন

  • সময়সীমা (কী উদ্দেশ্যে)?

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

এক সময়ের জন্য আমি মাল্টি-প্রসেসর বিতরণ সিস্টেমে যোগাযোগ লিঙ্কগুলি ব্যবহার করে সংযুক্ত হয়েছি (টিসিপি নয়, অন্য কিছু)। আমি একটি জিনিস শিখেছি ছিল যে মোটামুটি সাধারণীকরণ হিসাবে কিছু বিপজ্জনক মাল্টি-প্রোগ্রামিং জায়গা রয়েছে:

  • সারিগুলির উপর নির্ভরতা সাধারণত অশ্রুতে শেষ হয় (যদি কাতারে ভরা হয় তবে আপনি সমস্যায় পড়েছেন UN আপনি এমন একটি সারির আকার গণনা করতে পারবেন যা কখনই পূরণ করতে পারে না, এমন ক্ষেত্রে আপনি সম্ভবত কোনও নো-সারি সমাধান ব্যবহার করতে পারেন)

  • লক করার উপর নির্ভরতা বেদনাদায়ক, চেষ্টা করে দেখুন এবং অন্য কোনও উপায় আছে কিনা তা ভাবুন (যদি আপনাকে অবশ্যই লকিং ব্যবহার করতে হয়, সাহিত্যের দিকে নজর দিন, মাল্টি-প্রসেসরের বিতরণ লকিংটি গত ২-৩ দশকের অনেক এসিডেমিক কাগজগুলির বিষয় ছিল)

আমি আপনাকে লকিং ব্যবহার করে এগিয়ে যেতে হবে, তারপরে:

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

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

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

if (get_lock(remote_node) == timeout) then
  {
    take some failure action - the comms network is down
  }

/* Lock is now acquired - do work here */

if (release_lock(remote_node) == timeout) then
  {
    take some failure action - the comms network is down
  }

কলগুলি গেট_লক এবং রিলিজ_লকের মতো হওয়া উচিত (নীতিগতভাবে):

send_to_remote_node(lock_request)
get_from_remote_node_or_timeout(lock_reply, time)
if (result was timeout) then
  return timeout
else
  return ok

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

একটি পরামর্শ সম্পূর্ণ ভিন্ন পদ্ধতির গ্রহণ করা হয়। আপনি কি এমন কোনও রিমোট প্রসেসি কল ব্যবহার করতে পারেন যেখানে প্রতিটি আরপিসি কল তথ্যের একটি প্যাকেজ বহন করে যা প্রাপক দ্বারা পরিচালিত হতে পারে, এবং যা লকগুলির প্রয়োজনগুলি সরিয়ে দেয়?


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

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


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

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

@ জোজিকি - একটি ফিফো একটি সারি। সারি থেকে সাবধান। খুব যত্ন সহকারে সেই দিকটি ভাবুন। এটি অনেকটা মনে হচ্ছে আপনি কেবল "তাক থেকে দূরে" কিছু পেতে যাচ্ছেন না তবে আপনার সমস্যা এবং সমাধানটি সাবধানতার সাথে ভাবতে হবে।
দ্রুত

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

0

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

নিম্নলিখিত কোডটি একবার দেখুন;

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

// Instance of the object used to lock and unlock cache items in NCache
LockHandle lockHandle = new LockHandle();

// Specify time span of 10 sec for which the item remains locked
// NCache will auto release the lock after 10 seconds.
TimeSpan lockSpan = new TimeSpan(0, 0, 10); 

try
{
    // If item fetch is successful, lockHandle object will be populated
    // The lockHandle object will be used to unlock the cache item
    // acquireLock should be true if you want to acquire to the lock.
    // If item does not exists, account will be null
    BankAccount account = cache.Get(key, lockSpan, 
    ref lockHandle, acquireLock) as BankAccount;
    // Lock acquired otherwise it will throw LockingException exception

    if(account != null && account.IsActive)
    {
        // Withdraw money or Deposit
        account.Balance += withdrawAmount;
        // account.Balance -= depositAmount;

        // Insert the data in the cache and release the lock simultaneously 
        // LockHandle initially used to lock the item must be provided
        // releaseLock should be true to release the lock, otherwise false
        cache.Insert("Key", account, lockHandle, releaseLock); 
        //For your case you should use cache.Unlock("Key", lockHandle);
    }
    else
    {
        // Either does not exist or unable to cast
        // Explicitly release the lock in case of errors
        cache.Unlock("Key", lockHandle);
    } 
}
catch(LockingException lockException)
{
    // Lock couldn't be acquired
    // Wait and try again
}

লিঙ্কটি থেকে নেওয়া: http://blogs.alachisoft.com/ncache/distributes-locking/

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