已知有 2 台运行相同服务的异地服务器 A 和 B,A 与 B 之间只允许使用 UDP 协议进行通信。
这 2 台服务器会在未知的时间各收到一个(有且仅有一个)请求。
问:A 和 B 之间如何进行协商并得出谁先接收到这个请求?
1
Aliencn 2017-11-22 18:41:41 +08:00
假定环境中延迟稳定,且不丢包的情况下。
AB 服务器可以发测速包来获取延迟情况,然后对方发本地时间包加上延迟就能得到对方机器的时间。最终获得两台机器的时间差。 这样双方在接收到客户端请求的时候相互对比一下时间就行了。 实际情况中 丢包的问题可以使用 TCP over UDP 的方法来解决。 延迟不稳定的话,想了想只能通过大量测试求平均值的方法了。 更极端的情况下,A 和 B 完全丢包,但是都有可能收到客户端发来的请求,那就只能加一个 proxy 来中转 AB 的协商包了。 |
2
jadec0der 2017-11-22 19:39:44 +08:00
这个问题很奇怪啊,能讲一下场景吗?
通常分布式服务只要选举出一致的主节点就可以了,没必要追求主节点绝对是第一个。 |
4
MrIndescribable OP |
5
MrIndescribable OP @Aliencn
Hmmm, 实际上如果可以精确的算出 A 和 B 之间的时间差的话,这个问题就解决了。但是好难。 |
6
rogwan 2017-11-22 20:11:14 +08:00
有时候很拗造型的解决方案,试试跳出方案本身去考虑,这是不是该从下一层去考虑解决了。
|
7
MrIndescribable OP @rogwan 谢谢你的提醒,不过我不准备跳出这个方案
|
8
billlee 2017-11-22 21:17:14 +08:00
有这么复杂吗,用 NTP 同步一下时间就可以了啊
|
9
MrIndescribable OP @billlee
我列出的条件中写到了,不允许修改时间,避免使用第三方提供的时间。 |