问一个服务器间沟通相关的问题。

2017-11-22 17:24:08 +08:00
 MrIndescribable

问题如下:

已知有 2 台运行相同服务的异地服务器 A 和 B,A 与 B 之间只允许使用 UDP 协议进行通信。
这 2 台服务器会在未知的时间各收到一个(有且仅有一个)请求。

问:A 和 B 之间如何进行协商并得出谁先接收到这个请求?

注:

1767 次点击
所在节点    问与答
9 条回复
Aliencn
2017-11-22 18:41:41 +08:00
假定环境中延迟稳定,且不丢包的情况下。
AB 服务器可以发测速包来获取延迟情况,然后对方发本地时间包加上延迟就能得到对方机器的时间。最终获得两台机器的时间差。
这样双方在接收到客户端请求的时候相互对比一下时间就行了。


实际情况中
丢包的问题可以使用 TCP over UDP 的方法来解决。
延迟不稳定的话,想了想只能通过大量测试求平均值的方法了。

更极端的情况下,A 和 B 完全丢包,但是都有可能收到客户端发来的请求,那就只能加一个 proxy 来中转 AB 的协商包了。
jadec0der
2017-11-22 19:39:44 +08:00
这个问题很奇怪啊,能讲一下场景吗?

通常分布式服务只要选举出一致的主节点就可以了,没必要追求主节点绝对是第一个。
choury
2017-11-22 19:46:35 +08:00
@jadec0der #2 那至少要 3 台服务器才能进行选举
MrIndescribable
2017-11-22 19:52:56 +08:00
@Aliencn
我想到的最直接的办法就是计算时间差,但是很无奈,凭我的功力根本算不准。
至于丢包,不太可能出现那个几乎完全丢包的情况,按国内来说,正常的机房到机房通信能有 10%就很稀奇了。
微小的丢包可以在上层实现 ARQ 来解决,丢包问题基本可以忽略。



@jadec0der
实际应用场景不是分布式服务,是一个怪异的 TCP over UDP 服务的一部分。
具体内容就不深入了,我的目是想要知道,两端的 TCP 连接是哪一端先断开了。
我提出的问题中的 A 和 B 实际就是 TCP over UDP 服务的两端,那 2 个请求实际是 TCP 连接断开时所触发的 EPOLL_RDHUP
MrIndescribable
2017-11-22 20:04:55 +08:00
@Aliencn
Hmmm, 实际上如果可以精确的算出 A 和 B 之间的时间差的话,这个问题就解决了。但是好难。
rogwan
2017-11-22 20:11:14 +08:00
有时候很拗造型的解决方案,试试跳出方案本身去考虑,这是不是该从下一层去考虑解决了。
MrIndescribable
2017-11-22 20:23:12 +08:00
@rogwan 谢谢你的提醒,不过我不准备跳出这个方案
billlee
2017-11-22 21:17:14 +08:00
有这么复杂吗,用 NTP 同步一下时间就可以了啊
MrIndescribable
2017-11-23 09:37:52 +08:00
@billlee
我列出的条件中写到了,不允许修改时间,避免使用第三方提供的时间。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/408636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX