Trouble with Distributed Systems (3-1) - Unreliable Clocks

不可靠的时钟 (Unreliable Clocks)

时钟对应用程序来说很重要,它可以回答以下问题:

  1. 这个 request 该 timeout 了吗?
  2. 服务的 99 百分位回应时间为何?
  3. 在前五分钟的平均 QPS 多少?
  4. 使用者在我们网站会停留多久?
  5. 文章什麽时候发布的?
  6. Cache 什麽时候过期的?
  7. log 里的错误讯息是在什麽候发生的?

在分散式系统中,时间是一件棘手的事情,因为彼此的沟通可能会延迟且又不晓得延迟多久,更甚者,每台机器在硬体内都有自己的时钟:石英振荡器 (quartz crystal oscillator),此设备并不完全准确,所以每台机器都有自己的时间概念,这就代表了跟其他机器比起来可能有快有慢。

还好我们可以选择使用 网路时间协定 (Network Time Protocol) NTP 来同步时钟。

单调递增时钟 v.s. 日历钟 (Monotonic Versus Time-of-Day Clocks)

现代电脑有 2 个类型的时钟: 单调递增时钟 (Monotonic Clock)日历钟 (Time-of-Day Clock),区分它们是很重要的,它们有不同的用途。

日历钟 (Time-of-Day Clock)

日历钟根据了 壁时计时刻 (wall-clock time) 回传了挂上该时钟开始到现在的时间,简单说就是从 UTC 1970-01-01 开始到现在经过的秒数(或毫秒),不计算闰秒。相关函式有 Linux 的 clock_gettime(CLOCK_REALTIME) 和 Java 的 System.currentTimeMillis()

日历钟通常会使用 NTP 来同步时间,在特定情形中,如果本地时钟超过 NTP 服务器太多,它会强制重置且跳回先前的时间点,因为上述论点以及它们经常忽略闰秒的关系,日历钟比较不适合来测量执行时间。

单调递增时钟 (Monotonic Clock)

单调递增时钟就很适合来测量执行时间或间隔 (interval) 、timeout 或回应时间。它来自於系统启动後流逝的时间,所以它保证时间会一直往前进,相关函式有 Linux 的 clock_gettime(CLOCK_MONOTONIC) 和 Java 的 System.nanoTime()

当 NTP 检测到电脑的石英移动太快或太慢时,NTP 有可能会调整单调递增时钟向前移动的频率(称为 slewing the clock),预设是允许时钟速率加快或减慢 0.05%,但 NTP 不会让该时钟往前或往後跳,这个特性让大多数的系统能将执行时间等等的测量精确到奈秒等级。


乾是 TGI Friday 加上明天要上班所以懒的写了,剩下的明天补上吧!


<<:  [Day10] 设定 Actions On Google 专案

>>:  [Day10] JavaScript - 传值 & 传参考

Day 29 注册ASN必要的几个object

那今天呢,我们来讲解一下请LIR注册ASN需要几个重要的Object 首先,我们这边是以RIPE为例...

伸缩自如的Flask [day 28] Flask-Mail

在有必要的时候,我们可能需要使用寄信来通知使用者、寄信给公会小姐、 把AI数据视觉化的资料寄给老板。...

找LeetCode上简单的题目来撑过30天啦(DAY7)

昨天熬夜看小说,今天早上爬不起来就翘班(开玩笑的,是请假 今天赶快发一发文我要来去补眠 今天的题目↓...

11 - exa - 总览目录的工具

ls 指令会列出目录中的各个档案与目录,供使用者浏览整个目录的结构,是个十分常用的指令。 但它的设计...

NIST SDLC和RMF(续)

根据FIPS 199,“确定信息系统的安全类别需要进行更多的分析,并且必须考虑驻留在信息系统上的所有...