【问题标题】:How to design a multi-node application network layer?如何设计多节点应用网络层?
【发布时间】:2020-08-30 11:07:10
【问题描述】:

我需要实现一个基于 PaxosLease 的 mater 选举库。并且遇到了网络层设计的问题。

网络核心要求如下:

  • 每个节点既是服务器又是客户端
  • 系统可以在部分节点不在线的情况下工作

根据上述要求,我将网络层设计如下:

  • 使用 TCP 传输 msg。
  • 每个节点在指定端口上监听以接受连接(称为 ReadSession),这些连接只会读取 msg。
  • 通过匿名端口(称为WriteSession)连接到其他节点,这些连接只会写msg。

设计可能看起来不错。因为一开始有些节点可以离线,所以出现问题:ReadSession可以通过新的在线节点连接到节点来创建,如何创建WriteSession到新的在线节点?我们无法知道离线节点何时上线,只能通过接受来自新在线节点的新连接而不是其监听端口来知道其匿名端口。

这对我来说确实是一个设计问题。我目前有这两个想法:

  • 尝试使用UDP传输msg
  • 在抛出异常(表示连接失败)时,在Asio::ip::tcp::socket::async_connect中再次注册async_connect。但是这个想法仍然存在问题:
    1. asio::io_contextasync_connect 的处理程序上花费大量 IO 资源。
    2. 由于异步操作,我们无法在需要写入 msg 时立即准备好 WriteSession。

所以,我想要一个可以在新的在线节点连接到当前节点时立即准备好 WriteSession 的设计。

非常感谢!

【问题讨论】:

    标签: sockets tcp network-programming connection boost-asio


    【解决方案1】:

    实际上,您创建的网络拓扑是一个分布式系统。而且你所面临的问题已经被zookeeper、chubby等很多著名的应用解决了。

    如果你不想这么复杂,也许你可以尝试在局域网中使用一些广播协议,如 LSD,或者在 WLAN 中使用 DHT。

    【讨论】:

    • 是的,我知道Zookkeeper/Chubby已经解决了这个问题。我想知道有没有设计可以在新的在线节点上线时立即连接?如果没有,UDP也可以满足要求,但需要其他的东西,比如心跳等。嗯,谢谢你的回答。
    • 如果要“立即”连接新节点,则该节点必须向所有旧节点发送广播以声明其存在。那么你至少需要一个hertbeat设计和一个广播设计。我上面说的广播。 heartbeat 的职责是检查节点是否存活,广播用于获取新节点。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 2017-09-28
    • 2017-03-17
    • 2022-10-03
    • 1970-01-01
    • 2017-05-15
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多