【发布时间】: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。但是这个想法仍然存在问题:-
asio::io_context在async_connect的处理程序上花费大量 IO 资源。 - 由于异步操作,我们无法在需要写入 msg 时立即准备好 WriteSession。
-
所以,我想要一个可以在新的在线节点连接到当前节点时立即准备好 WriteSession 的设计。
非常感谢!
【问题讨论】:
标签: sockets tcp network-programming connection boost-asio