1.引言
- 当没有手表的时候,你不清楚现在是几点。
- 当有了1块手表时,你知道现在是几点。
- 当有了2 块手表时,它们的时间显示不一致时,你又不知道现在是几点。
- 当你碰到有个人和你一样都有手表,但时间不一致时,你还是不知道现在是几点。
- 当你对着电视对标,看了眼电视显示是 6 点整,当低头调完表时,再看表这时电视又比手表快了几秒,于是又继续调表,经过几轮后,好像偏差不大了。
- 过了几个月,你发现手表又和电视上的不一致了……
- 当学了高中物理后,知道了电视信号传播是需要时间了,知道了电视上的时间只是导播随电视画面一起传给你播放的画面,于是全国各地看到的 6 点的画面其实是有先后的。
- 当你出国后,发现国外有人有他们心中的“CCTV”,你又开始思考不同国家的人的时间差。
- ……
2.问题分析
我们在日常生活中面临的问题,计算机系统也面临同样的问题,站在计算机系统角度面临 4 种时间。
-
自己的系统时间:
- 硬件时钟:计算机硬件有个使用电池的实时时钟(Real-time Clock, RTC)也叫(CMOS时钟,BIOS时间)。这个于电池质量和使用时长等有关。
- 系统时钟:又名软件时钟,由Linux内核计算为自1970年1月1日午夜UTC以来的秒数。系统时钟的初始值由硬件时钟计算。系统正常运行后,由系统内核独自运行系统时钟。
- 自己选择对标的基准时间:可选择自建自己的时间服务器,也可选择对标公共时间服务器
- 协作模块的时间:由于每个系统选取的时间坐标不同,则大家在协作时时间不一致是常态,如果凑巧一致且长期一致,真是罕见的幸事。
-
世界公认的标准时间:一般认为UTC和GMT是相等的,但是会存在0.9秒以内的误差,这是由于地球不规则自转引起的。
- UTC(Universal Time Coordinated),即协调世界时。全世界统一的世界标准时间。需要不规则地加入闰秒。
- GMT(Greenwich Mean Tim),格林尼治平均时间。
3.产品设计建议
- 时间不一致是常态,要基于这个前提来设计
- 可以以抽象的时间代替具体时间,如业务流水号
- 以相对时间代替绝对时间
- 日志要有基于自身时钟的时间戳,建立自己的时间体系,以便于自身问题的排查和定位