为什么我应该使用应用程序级别的心跳来代替TCP keepalive来检测陈旧的连接,因为我们的设置只涉及Windows和Linux机器?
答案 0 :(得分:3)
似乎无法在Windows或OSX上基于每个插槽设置TCP keepalive参数,这就是原因。
编辑:除了保持活动重新传输次数之外的所有参数实际上也可以在Windows上设置(2000以后):http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx
我试图用zeromq做这件事,但似乎zeromq在Windows上不支持这个?
答案 1 :(得分:2)
来自John Jefferies回复:ZMQ Pattern Dealer/Router HeartBeating
"保持连接活动不需要心跳(TCP套接字有一个ZMQ_TCP_KEEPALIVE套接字选项)。相反,双方都需要心跳才能知道另一方仍然活跃。如果任何一方确实检测到另一方处于非活动状态,则可以采取其他措施。"
答案 2 :(得分:0)
TCP keepalive提供与应用程序级心跳完全不同的功能。 keepalive就是这样,它使TCP会话保持活动状态,而不是让它在长时间的静默之后超时。这很重要,并且(如果适用)您应该在您的应用程序中使用它。但是由于不活动而死亡的TCP会话只是在一对ZMQ套接字之间切断连接的一种方式。一个端点可能会在90分钟内断电并且处于脱机状态,在这种情况下,TCP keepalives不会为你做下蹲。
应用程序级别的心跳不旨在使TCP会话保持活动状态,如果可能的话,期望您依赖该功能的keepalive。 Heartbeating可以告诉您的应用程序连接实际上仍处于活动状态,并且对等套接字仍然正常运行。这会告诉您对等方不可用,因此您可以通过缓存消息,抛出异常,发送警报等等来表现得恰到好处。
简而言之: