3

我正在我们的预生产环境中测试 Diffusion 解决方案。该解决方案为匿名客户提供 10 分钟的免费访问时间,然后他们必须进行身份验证或断开连接。这在开发和早期测试中运行良好,但在预生产中,当一个客户端断开连接时,我们会看到许多其他客户端同时无故断开连接。将日志记录设置为 FINEST 后,日志文件会显示:

2016-03-21 11:57:36.557|DEBUG|Diffusion: InboundThreadPool Thread_4||NIOBufferedChannel@52e2a219[connected local=/10.0.4.1:8080 remote=/10.0.1.99:58673] : Closed(UNEXPECTED_ERROR) Unexpected error EOF|com.pushtechnology.diffusion.io.message.MessageChannelException
2016-03-21 11:57:36.558|DEBUG|Diffusion: InboundThreadPool Thread_4||Java Client 50328FF242799CD4-000000000000015A AWAITING_RECONNECTION@10.0.1.99: State changed from CONNECTED to AWAITING_RECONNECTION.|com.pushtechnology.diffusion.clients.impl.ClientImpl
2016-03-21 11:57:36.558|DEBUG|Diffusion: InboundThreadPool Thread_4||Java Client 50328FF242799CD4-000000000000015A AWAITING_RECONNECTION@10.0.1.99: CONNECTION_LOST keeping alive for 60000 ms.|com.pushtechnology.diffusion.clients.impl.ClientImpl

受影响的客户端始终是浏览器,而不是智能手机。通常是较旧的浏览器,例如 IE9。

4

1 回答 1

4

我猜你的预生产环境有一个负载均衡器,它设置为使用连接池。v10 之前的 IE 版本不支持 WebSocket,因此它们将使用 XHR 长轮询。您的智能手机客户端也将使用 WebSockets,因此不会受到影响。

该手册在“使用负载平衡器时的注意事项”部分中有这样说

不要将连接池用于负载平衡器和 Diffusion 服务器之间的连接。如果多个客户端连接通过单个服务器端连接进行多路复用,这可能会导致客户端连接过早关闭。

在 Diffusion 中,客户端在该连接的生命周期内与单个 TCP/HTTP 连接相关联。如果 Diffusion 服务器关闭客户端,连接也会关闭。Diffusion 不区分单个客户端连接和多路复用连接,因此当共享多路复用连接的客户端关闭时,负载均衡器和 Diffusion 之间的连接将关闭,随后所有客户端连接都通过该服务器端进行多路复用连接关闭。

来说明问题。当 Diffusions 服务器与其受众 Alice、Bob 和 Charlie 有直接连接时,关闭 Bob 的连接是直截了当的

没有负载均衡器的扩散和受众

当连接池中间盒(代理或负载平衡器)进入混合时,关闭 Bob 的连接也会导致 Alice 和 Charlie 断开连接。

使用连接池中间盒的扩散和受众

因此,虽然连接池对于常规 HTTP 服务器是一个好主意,但如果 Diffusion 服务器需要断开离散客户端的连接,它会为娱乐 XHR 轮询客户端的观众带来问题。

于 2016-03-21T16:07:39.247 回答