Skip to content

Commit 94774a9

Browse files
committed
debug: 单调时钟与日历时钟
1 parent c69d949 commit 94774a9

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

debug/index.rst

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,26 @@ RPC/Web 框架
192192

193193
分布式系统问题
194194
~~~~~~~~~~~~~~~~~~~~~~
195-
分布式系统会碰到的问题:网络中的数据包可能会丢失、重新排序、重复递送或任意延迟;时钟只是尽其所能地近似;且节点可以暂停(例如,由于垃圾收集)或随时崩溃。
195+
分布式系统中可能会碰到的问题:
196196

197-
- 分布式锁。分布式服务对于需要数据同步的操作可以使用分布式锁,注意分布式锁的超时问题(本身是否高可用)
197+
- 网络中的数据包可能会丢失、重新排序、重复递送或任意延迟(超时)
198+
- 时钟只是尽其所能地近似(时钟回拨等)
199+
- 节点可以暂停(例如,由于垃圾收集)或随时崩溃:检测和剔除故障节点(负载均衡);失败转移(主从)
200+
201+
常见的业务开发可能会碰到的坑:
202+
203+
- 分布式锁。分布式服务对于需要数据同步的操作可以使用分布式锁,注意分布式锁的超时问题(本身是否高可用)。Redission 实现比较完善
198204
- 时钟倾斜(clock skew)。如果代码强依赖时间戳在不同的服务器上可能因为时钟差距导致问题,可以采用适当取整对齐时钟。有一些第
199205
三方库允许一定的时间差容忍(比如乘以一个误差因子)。https://github.com/dgrijalva/jwt-go/issues/383
200206
- 分布式数据库。注意有些分布式数据库插入数据之后不会返回主键。可以用分布式 id 生成器(snowflake算法)指定主键作为 shard key
201207
- 时钟同步出错(ntp同步问题)。笔者最近碰到的问题,云服务机器时钟出问题了,导致我一些服务鉴权带上时间戳参数的失败了。依赖
202208
时间的比如 snowflake算法 如果出现时钟回拨可能会产生重复 id。
209+
- 日历时钟与单调时钟。(参考《设计数据密集型应用》第八章-分布式系统的麻烦)
210+
211+
- Time-of-day clock(日历时钟) : 返回从 epoch(UTC 时间 1970 年 1 月 1 日午夜)开始的秒数(可能回拨)。需要从 NTP(网络时间协议) 服务器同步信息。linux的 clock_gettime(CLOCK_REALTIME) 或者 java System.currentTimeMillis()。日历时钟无法用来测量经过时间
212+
- Monotoinc clock: 经常用来衡量时间间隔(time interval),例如超时或者服务器响应时间,保证不会回跳,但是单调钟的绝对值无意义。linux的 clock_gettime(CLOCK_MONOTONIC) 或者 java System.nanoTime()
213+
- python3 的 time.monotonic() 方法和go 1.9 之后的 time 包使用了单调时钟
214+
- bwmarrin/snowflake 包使用了 go 的 time 包解决时钟漂移的问题,参考 https://github.com/bwmarrin/snowflake/pull/18
203215

204216
缓存(redis)问题
205217
~~~~~~~~~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)