如何设计多节点应用程序网络层?

问题描述 投票:1回答:1

我需要实现基于PaxosLease的主选举库,并在网络层设计上遇到问题。

网络核心要求如下:

  • 每个节点既是服务器又是客户端
  • 系统可以在没有某些节点在线的情况下工作

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

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

设计看起来不错。由于某些节点在开始时可能会脱机,因此会出现问题:ReadSession可以由连接到该节点的新的联机节点创建,如何为该新的联机节点创建WriteSession?我们无法知道离线节点何时联机,我们只能通过接受来自新联机节点的新连接而不是其侦听端口来了解其匿名端口。

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

  • 尝试使用UDP传输味精
  • 引发异常时,将async_connect重新注册到Asio::ip::tcp::socket::async_connect中(意味着连接失败)。但是这个想法仍然存在问题:
    1. [asio::io_context]在async_connect的处理程序上花费了很多IO资源。
    2. 由于异步操作,当我们需要写消息时,我们无法立即使WriteSession准备就绪。

因此,我希望有一个设计可以在新的联机节点连接到当前节点后立即准备WriteSession。

非常感谢!

sockets tcp network-programming connection boost-asio
1个回答
1
投票

实际上,您创建的网络拓扑是一个分布式系统。您所面对的问题已由Zookeeper和chubby等许多著名应用程序解决。

如果您不想那么复杂,也许您可​​以尝试使用某些广播协议,例如LAN中的LSD或WLAN中的DHT。

© www.soinside.com 2019 - 2024. All rights reserved.