【问题标题】:Disconnecting a single client disconnects many other clients断开单个客户端会断开许多其他客户端
【发布时间】:2016-03-21 15:01:01
【问题描述】:

我正在我们的预生产环境中测试 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。

【问题讨论】:

    标签: java websocket push-diffusion


    【解决方案1】:

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

    手册在"Considerations when using load balancers"部分有这个说法

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-21
      • 2012-01-07
      • 2013-02-17
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多