V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
MrIndescribable
V2EX  ›  问与答

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

  •  
  •   MrIndescribable · 2017-11-22 17:24:08 +08:00 · 1741 次点击
    这是一个创建于 2551 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题如下:

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

    注:

    • A 和 B 的本地时间所提供的 timestamp 可能存在一定差异,并且不允修改本地时间
    • A 和 B 之间的通信存在较高的网络延迟。(大于 50ms)
    • 避免使用第三方提供的时间
    第 1 条附言  ·  2017-11-22 19:53:46 +08:00
    条件补充: 假定 A 和 B 之间的网络通信不存在丢包
    9 条回复    2017-11-23 09:37:52 +08:00
    Aliencn
        1
    Aliencn  
       2017-11-22 18:41:41 +08:00
    假定环境中延迟稳定,且不丢包的情况下。
    AB 服务器可以发测速包来获取延迟情况,然后对方发本地时间包加上延迟就能得到对方机器的时间。最终获得两台机器的时间差。
    这样双方在接收到客户端请求的时候相互对比一下时间就行了。


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

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

    通常分布式服务只要选举出一致的主节点就可以了,没必要追求主节点绝对是第一个。
    choury
        3
    choury  
       2017-11-22 19:46:35 +08:00
    @jadec0der #2 那至少要 3 台服务器才能进行选举
    MrIndescribable
        4
    MrIndescribable  
    OP
       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
        5
    MrIndescribable  
    OP
       2017-11-22 20:04:55 +08:00
    @Aliencn
    Hmmm, 实际上如果可以精确的算出 A 和 B 之间的时间差的话,这个问题就解决了。但是好难。
    rogwan
        6
    rogwan  
       2017-11-22 20:11:14 +08:00
    有时候很拗造型的解决方案,试试跳出方案本身去考虑,这是不是该从下一层去考虑解决了。
    MrIndescribable
        7
    MrIndescribable  
    OP
       2017-11-22 20:23:12 +08:00
    @rogwan 谢谢你的提醒,不过我不准备跳出这个方案
    billlee
        8
    billlee  
       2017-11-22 21:17:14 +08:00
    有这么复杂吗,用 NTP 同步一下时间就可以了啊
    MrIndescribable
        9
    MrIndescribable  
    OP
       2017-11-23 09:37:52 +08:00
    @billlee
    我列出的条件中写到了,不允许修改时间,避免使用第三方提供的时间。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2903 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:38 · PVG 22:38 · LAX 06:38 · JFK 09:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.