我正在使用套接字构建一个实时失效的应用程序,当我有一些工作时,一旦我重新启动服务器似乎停止工作(心跳不再发送)。 在试图找到治疗方法的过程中,我意识到我并不完全理解整个概念,所以我决定在这里发表几个问题:
我试着保持这个问题的一般性,但如果您感兴趣,我的应用程序是用Flex编写的,并使用FlashSocket.IO连接到我的服务器(Tornado + Tornadio2 + tornadoredis)
答案 0 :(得分:2)
- 谁负责重新连接?是客户吗?
是
- 双方(客户端和服务器)是否必须采取措施才能支持重新连接机制?
服务器必须首先执行它所做的事情:接受连接。客户端还必须首先执行它所做的事情:创建连接。
- 这是一个额外的问题 - 如何实现套接字冗余(使用多个服务器的能力)。
当第一个服务器发生故障时连接到另一台服务器。
我是否必须在会话存储中保留所有连接(redis)?
没有。这只会浪费关系。
如何在这种情况下处理重新连接?
在任何情况下处理它们的方式相同。只需从客户端重新连接即可。但是,如果您有多个故障转移服务器,您不希望重新连接到刚刚失败的服务器,则需要创建与故障转移服务器组的其他成员的新连接。
答案 1 :(得分:0)
对于遇到此问题的任何人来说,知道套接字是否已关闭的最简单方法是send()或recv()返回0(或-1)。但是,我认为发送()0字节也是可能的,此时recv()在技术上仍然可以返回0,但保持打开状态。
我想你可以通过等待几秒钟并再次尝试发送()来处理这种情况。如果确实关闭了,并且您尝试向套接字发送()数据,那么您将返回-1。如果它再次为零,那么这意味着recv()结束没有内存让缓冲区接受任何东西。
答案 2 :(得分:-1)
通常,如果需要,客户负责检测和重新连接。根据客户端和服务器之间共享的状态,两者都可能有一些“重启”状态。恢复过程,例如,如果客户端在服务器上持有锁,则服务器应释放客户端断开连接的锁,客户端必须获取新锁。这在很大程度上取决于您的客户端和服务器的功能。如果您想拥有分布式/群集服务,那么上面的大部分内容仍然是正确的。它更复杂,因为服务器之间共享服务器状态,您必须同步它。可能你不想自己实现这个并使用现有的解决方案之一 - redis,mongodb,apache-zookeeper ....