【发布时间】:2017-07-17 16:01:33
【问题描述】:
如果有多个 socket.io 服务器(ALB 平衡),客户端正在与两个节点连接和断开连接,从而给出“传输错误”。理想情况下,它应该连接到一个节点并保持连接到该节点。如果 ALB 中有一个节点,则连接保持持久。有什么帮助吗??
【问题讨论】:
标签: android node.js sockets socket.io
如果有多个 socket.io 服务器(ALB 平衡),客户端正在与两个节点连接和断开连接,从而给出“传输错误”。理想情况下,它应该连接到一个节点并保持连接到该节点。如果 ALB 中有一个节点,则连接保持持久。有什么帮助吗??
【问题讨论】:
标签: android node.js sockets socket.io
默认情况下,socket.io 首次启动时,会以 http 轮询模式启动。经过几次连续的 http 请求,并在两端的能力检查正常后,它将切换到 webSocket 模式。这样做是为了首先建立一个工作连接,然后确定两端是否支持 webSocket,如果支持,则切换到使用 webSocket。如果您有一个非粘性负载均衡器,那么您确实可能会遇到前几个 http 轮询请求最终在不同服务器上的问题,这可能会破坏 socket.io 的工作方式,因为单个服务器会丢失一些连接启动顺序。
您可以将负载均衡器配置为粘性,以便它们始终将相同的客户端发送到同一台服务器,或者您可以告诉 socket.io 您只希望它以 webSocket 模式连接。
要将 socket.io 配置为仅使用 webSocket 而没有轮询(因此只有一个连接),您可以在客户端中设置一个配置选项,如下所示:
Socket.io 1.x: use WebSockets only?
请记住,socket.io 具有自动连接逻辑,因此如果在您建立与服务器的 socket.io 连接后的某个时间,连接由于某种原因停止工作,客户端将断开当前连接并尝试做一个新的。如果您仍在使用非粘性负载平衡器,那么重新连接可能会在不同的服务器上结束。取决于您在服务器上执行的操作,这可能是也可能不是问题。粘性负载平衡将确保重新连接在同一台服务器上结束。
【讨论】:
使用 0.8.3 版本的 io.socket 删除新版本 1.0.0
compile('io.socket:socket.io-client:0.8.3') {
exclude group: 'org.json', module: 'json'
}
这对我有用
【讨论】:
删除旧版本后使用以下版本的io.socket: https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js
它对我有用!
【讨论】: