客户端

巧妙测量服务器之间的时间差【转】

所在版块: 程序员 2016-02-18 05:18 [复制链接] 查看: 2639|回复: 0
                                                昨天,和大家讨论了无线APP时代如何进行日志上报优化【回复“日志”阅读】,今天和大家一起讨论一下如何巧妙测量服务器之间的时间差。


缘起:无绝对时钟
Fischer Lynch Paterson定理是分布式理论中非常重要的一个定理,其结论相当悲观:在一个多进程异步系统中,由于没有全局绝对时钟,一定不存在一个一致的消息投递协议。


工程折衷:单点序列化
每个进程,每台服务器都有自己的本地时钟,跨服务器的本地时钟比较是没有意义的,这一点很好理解,服务器A上的本地时间ta=1,服务器B上的本地时间tb=2,虽然tatb,但我们并不能说ta一定早发生,因为两台服务器的本地时间会有差异。
工程上,可以使用一台单点服务器来分发序列号,或者使用这台单点服务器来进行序列化,来模拟全局时钟


问题的提出:既然两台服务器的本地时间存在差值,如何来测量两台服务器之间的时间差呢?
答案是,发包测量

发包流程如上图:
1)服务器A记录一个本地时间Ta1,然后向服务器B发送一个报文
2)服务器B接收到报文后取本地时间Tb放入到报文中,并将报文发回给服务器A
3)服务器A收到回复报文后,记录本地时间Ta2
很容易知道,Ta1和Ta2取的是服务器A的本地时间,Tb取的是服务器B的本地时间。


假设报文往返耗时是相同的(这个假设很合理),那么:
x = (Ta2 - Ta1)/2


如果,你硬要说这个x通过一次测量不准确的话,可以发1亿次往返请求,来求出一个相对精确的x值


假设服务器A与服务器B的绝对时间是相同的(这个假设不合理),那么:
Tb = Ta1 + x = (Ta2 + Ta1)/2


可实际上,服务器A与服务器B存在一个时间差,不妨设时间差是“德尔塔”,那么:
Tb + “德尔塔” = Ta1 + x= (Ta2 + Ta1)/2


于是,“德尔塔” = (Ta2 + Ta1)/2– Tb
这个“德尔塔”就是服务器A与服务器B的时间差


为什么是“德尔塔”?
因为那个三角形我打不出来。
==【完】==
回【面试】小马哥教你做合格的面试官
回【晋升】晋升的为何不是你
回【技能】互联网架构师必备技能
回【负载】一幅图秒懂LoadAverage
==小游戏==
回大于10的整数,返回随机好文(猜猜怎么实现的


若有收获,转发一篇好文只需3秒钟,谢谢。
                    
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码关注微信公众号

QQ|Archiver|手机版|小黑屋|mwt-design ( 沪ICP备12041170号-1

GMT+8, 2025-5-3 07:44 , Processed in 0.070143 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回列表