ساعتی که توی سیستمها داریم معمولا با یه کریستال کوارتزی کنترل میشه و خب خطا هم داره. برای حل خطاش معمولا سیستمها به یکسری سرور وصل میشن و تایمشون رو آپدیت میکنن، مثلا با پروتوکل NTP (یا همون network time protocol) که خیلی پروتوکل جالبیه و پیچیدگیهای بامزهای رو حل میکنه (ویدیوی اول رو ببینید)
این تنظیم زمان اگرچه خوبه اما یه گارانتی مهم رو از سیستم حذف میکنه: زمان دیگه فقط صعودی نیست! ممکنه بین دو بار پرسیدن زمان، زمان اول از دوم بیشتر باشه!
این موضوع به همراه تاخیر شبکه و این که دقت NTP هم بینهایت نیست باعث میشه که ما نتونیم تو یه سیستم distributed با خوندن تایم فعلی سیستم و مقایسهش با تایم فعلی یک سیستم دیگه، بفهمیم کدوم یکی از اتفاقات زودتر افتاده.
لزلی لمپورت در مقاله معروفش به این مشکل پرداخته.
Time, Clocks, and the Ordering of Events in a Distributed System
لزلی لمپورت در اصل فیزیکدان بوده و با دید فیزیک وارد distributed systemها میشه و چیزهای جالبی مثل الگوریتم Paxos و جنرالهای بیزانسی (یا تحمل خطای بیزانسی) رو اختراع کرده.
لمپورت در زمینه ساعتها یه مدل ارائه میده که در اصل یه شمارندهست که سیستم نرمافزاری بر اساس اتفاقاتی که برای خودش میافته یا پیامهایی که میفرسته یا میگیره بروزرسانی میکنه. این ساعت دیگه سعی نمیکنه «زمان واقعی دنیا» رو اندازه بگیره، بلکه فقط ترتیب علّی (causal ordering) اتفاقات رو مدل میکنه؛ یعنی اگر رویدادی باعث رویداد دیگهای شده باشه، عدد ساعتش هم این رابطه رو حفظ میکنه. به این ترتیب بدون اینکه به ساعت فیزیکی یا هماهنگسازی جهانی وابسته باشیم، میتونیم بفهمیم کدوم اتفاق قبل از کدوم یکی رخ داده و از همین مفهوم ساده، کلی الگوریتم و تضمین مهم در سیستمهای توزیعشده ساخته میشه.
https://www.youtube.com/watch?v=Ihm6AYNFUKA
https://sookocheff.com/post/time/lamport-clock/
https://martinfowler.com/articles/patterns-of-distributed-systems/lamport-clock.html
https://lamport.azurewebsites.net/pubs/time-clocks.pdf
Post #3255
1.99K