我们有一个节点实例,它有大约2500个客户端套接字连接,一切运行正常,除非偶尔发生一些事情发生在服务上(azure中的重启或故障转移事件),当节点实例重新启动并且所有套接字连接尝试重新连接时服务停止,日志只显示重复的套接字连接/断开连接。即使我们停止服务并启动它同样的事情发生,我们目前发送一个包到我们的内部服务器杀死用户chrome会话然后一切正常,因为用户开始再次登录。我们的客户端当前只连接'forceNew'并强制使用Web套接字,而不是默认的长轮询而不是升级。有人见过这个或有想法吗?
答案 0 :(得分:0)
在您的socket.io客户端代码中,您可以强制重新连接以及时分散。这里看起来最相关的两个配置变量是:
reconnectionDelay
确定socket.io在尝试重新连接之前最初会等待多长时间(如果服务器停机一段时间,它应该从那里退出)。您可以增加此值,以降低他们同时尝试重新连接的可能性。
randomizationFactor
这是0到1.0之间的数字,默认为0.5。它确定了上述延迟随机修改的程度,以使客户端重新连接更加随机,而不是同时进行。您可以增加此值以增加重新连接时间的随机性。
有关详细信息,请参阅client doc here。
您可能还想探索您的服务器配置,以查看它是否具有适当数量的传入套接字请求的可扩展性。虽然没有人希望服务器能够同时处理2500个并发连接,但服务器应该能够排队这些连接请求并在它获得时间时为它们提供服务,而不会立即使任何无法立即处理的传入连接失败。在队列中保留了一些连接的理想中间点(通常可由服务器端TCP配置参数控制),然后当队列变得太大时,连接立即失败,然后socket.io应该后退并再次尝试一会儿。调整上述变量将使其在重试前等待更长时间。
另外,我很好奇您使用forceNew
的原因。这似乎不会对你有所帮助。仅强制WebSockets(没有初始轮询)是一件好事。