考虑各种设备的大规模异构网络。这些设备以对等方式向网络上的其他人提供服务。用于跟踪所有节点上的服务可用性的机制当前使用标记为保持活动的TCP套接字,通常在节点在线的持续时间内。这导致每个节点都与每个其他节点(在对等基础设施的子网内)打开一个套接字。
关于以这种方式使用TCP keep-alive的可扩展性存在哪些争论?
我的替代方法是使用发布/订阅模型,其中节点在新网络可用时将新服务推送到网络,并且他们的对等方在他们想要订阅服务时将其缓存。这听起来可行吗?
答案 0 :(得分:1)
我从你所写的内容中解释说,沟通是严格的点对点,持续时间相当长(“租约”)。如果这是真的,则意味着您将在发布 - 订阅模型中获得任何收益。如果不是这样,那么是的,您应该(可以)更改网络模型以匹配通信,并且您的想法听起来很合理。
关于你的第二个问题,由于TCP套接字和keep-alive只是一个概念,因此没有(或非常小的)具有这种保持活动合同的内在成本。在实践中YMMV因为不同的套接字实现需要不同的资源,并且可能需要其他动作来保持信道打开。然而,有许多实现需要非常少的资源来打开套接字(例如select() - 类型)。
如果有许多相同类型服务的实施者,并且您不能(或者不想)静态地预测它们将出现在哪里,那么发现服务(服务的发布/订阅)是最有意义的。
简而言之,我会说,如果您所拥有的通信类型严重符合当前架构,您应该只更改设计。您的想法听起来确实非常可行,但有关沟通模式的更多信息对于估计结果是必要的。
答案 1 :(得分:0)
对于任何P2P网络来说,使用keep alive似乎是一个坏主意。我不仅会在传输数据时保持打开连接,还会将节点状态更新完全保留在不同的套接字上,以免干扰文件传输。
答案 2 :(得分:0)
如果正在使用 仅来跟踪服务可用性(意味着,您从不在这些连接之间传递服务请求/响应),那么使用TCP套接字绝对是一种过度杀戮。 TCP套接字确实占用了大量资源。
更具伸缩性的方法可能是使用发布/订阅模型,该模型定期使用UDP发布消息来宣传服务的持续存在。您还可以使用从断开连接的节点发布的服务停止消息来正常声明服务终止。
更进一步,如果你的意思是通过真正的大规模网络获得最佳效果,并准备投入一些时间和精力 - 考虑像DHT这样的结构化P2P机制。