1. 不可靠的时钟。
- Time-of-day clock存在leap seconds. monotonic clock 可以被用来计算 timeout delay.
- 不同机器上时钟不一致。
- 计算机上的石英时钟本身就存在误差。
- NTP server 的同步时钟数据出错。
- 网络延迟导致NTP时钟实时性存在偏差。
- 时间可能会跳动,出现一分钟只有59秒或61秒。
- 虚拟机上的CPU占用导致时钟同步跳跃。
- 终端用户的恶意修改时间。
- Last write wins (LWW) 存在问题。
解决方案:
- 配置多个NTP server。防止离群数据。
- logical clock. version vector 来保证event顺序。
- Clock readings have a confidence interval。
2. 不可靠的网络。
- 交换机/路由器中断,网络故障,网络丢包。
- 可能被queue在网络中,等待传输。
- 远程节点可能已经崩溃。
- 远程节点暂停相应。(垃圾回收,进程中断)
- 远程节点的响应包被错误的网络配置干扰,无法送达。
- 远程节点的响应包正在等待传输
3. 程序暂停 Process Pause
- garbage collector
- virtual machine suspended
- end-user device such as laptop
- waiting for disk
- swapping to disk (paging)
- SIGSTOP signal
解决方案:
1. 限制 gc的影响,例如node提前通知gc事件,仅仅对short-lived 对象进行gc。
4. 不可靠的队友。
- fencing token 解决分布式锁问题。 被操作的资源本身必须check token来拒绝任何比当前处理过的token更老的操作。
- 拜占庭将军问题。Bitcoin,和宇宙射线更改内存。