انتخاب رهبر یک الگوی طراحی است که مفهوم "یک نفر باید این کار را انجام دهد" را به "دقیقاً یک گره مجاز به انجام این کار است و باید به طور مداوم ثابت کند که شایستگی آن را دارد" تبدیل میکند. این مقاله به بررسی یک الگوی انتخاب رهبر مبتنی بر اجاره (lease) میپردازد که میتوان آن را در C# با یک هماهنگکننده پایدار، حلقه تمدید، مکانیزم بازگشت (backoff) و بررسیهایی که از ایجاد دو رهبر در یک روز بد جلوگیری میکنند، پیادهسازی کرد.
مشکل اصلی، رفتار چند رهبره اتفاقی است که اغلب در رویدادهای معمول مانند مقیاسبندی از یک نمونه به دو نمونه، استقرار تدریجی، توقف یک گره ناشی از جمعآوری زباله یا همسایه پر سر و صدا، یا پارتیشنی که هر دو طرف را زنده و مطمئن نگه میدارد، رخ میدهد. علائم قابل پیشبینی هستند: یک شغل زمانبندی شده دو بار اجرا میشود، یک هندلر دستور همان اثر جانبی را دو بار اعمال میکند، دو نویسنده بهروزرسانیهای متضاد را ارسال میکنند و تلاشهای مجدد شعاع انفجار را تشدید میکنند.
مدل ذهنی انتخاب رهبر ساده است: رهبری یک اجاره با یک مهر زمانی انقضا است، یک رهبر باید قبل از انقضا تمدید کند، اگر تمدید ناموفق باشد، گره فوراً از نقش رهبری دست میکشد و دنبالکنندگان به طور مداوم با استفاده از بازگشت و لرزش (jitter) برای به دست آوردن اجاره تلاش میکنند. یک اجاره قفلی نیست که برای همیشه در دست داشته باشید، بلکه ادعایی است که باید به طور مداوم آن را به دست آورید.
نکات مهم در طراحی شامل تنظیم TTL (مدت زمان اعتبار اجاره) است که TTL کوتاه باعث بازیابی سریعتر و چرخش بیشتر میشود، در حالی که TTL طولانی باعث بازیابی کندتر و انتخابات کمتر میشود. همچنین، فاصله تمدید باید یک سوم TTL به همراه لرزش کوچک باشد و رفتار در هنگام قطع هماهنگکننده باید به گونهای باشد که رهبری در صورت شکست تمدید، رها شود.
کلید محدوده (key scope) باید برای هر گروه یا قطعه (shard) یکسان باشد و حلقه انتخاب در هر گره به طور یکسان اجرا میشود.
مشاهده مطلب اصلی