6

考虑到我们的设置中只涉及 Windows 和 Linux 机器,我是否有理由使用应用程序级心跳而不是 TCP keepalives 来检测陈旧的连接?

4

3 回答 3

4

似乎不能在 Windows 或 OSX 上基于每个套接字设置 TCP keepalive 参数,这就是原因。

编辑:除了保活重传次数之外的所有参数实际上也可以在 Windows(2000 年以后)上设置:http: //msdn.microsoft.com/en-us/library/windows/desktop/dd877220%28v=vs.85 %29.aspx

我试图用 zeromq 做到这一点,但似乎 zeromq 在 Windows 上不支持这个?

于 2013-11-05T00:19:54.617 回答
3

来自 John Jefferies 的回应:ZMQ 模式经销商/路由器心跳

“不需要心跳来保持连接处于活动状态(TCP 套接字有一个 ZMQ_TCP_KEEPALIVE 套接字选项)。相反,双方都需要心跳才能知道对方仍然处于活动状态。如果任何一方确实检测到另一方是不活动,它可以采取替代行动。”

于 2015-08-19T14:55:16.633 回答
0

TCP keepalive 提供与应用程序级心跳完全不同的功能。keepalive 就是这样做的,它使 TCP 会话保持活动状态,而不是让它在长时间的静默后超时。这很重要而且很好,并且(如果合适的话)你应该在你的应用程序中使用它。但是由于不活动而导致的 TCP 会话死亡只是在一对 ZMQ 套接字之间切断连接的一种方式。一个端点可能会断电 90 分钟并处于离线状态,在这种情况下,TCP keepalives 不会为你蹲下。

应用程序级心跳不是为了保持 TCP 会话处于活动状态,希望您尽可能依赖 keepalives 来实现该功能。心跳可以告诉您的应用程序连接实际上仍然处于活动状态并且对等套接字仍然正常工作。这将告诉您您的对等方不可用,因此您可以通过缓存消息、抛出异常、发送警报等来适当地表现。

简而言之:

  • TCP keepalive 旨在保持连接处于活动状态(但不能防止所有断开连接情况)
  • 应用程序级心跳旨在告诉您的应用程序连接是否处于活动状态
于 2015-08-19T19:28:29.200 回答