断开单个客户端会断开许多其他客户端的连接

时间:2016-03-21 15:01:01

标签: java websocket push-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。

1 个答案:

答案 0 :(得分:4)

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

手册在"Considerations when using load balancers"

部分中有说明

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

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

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

Diffusion and audience with no load balancer

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

Diffusion and audience with connection-pooling middlebox

所以,而连接池对于常规HTTP服务器来说是一个好主意,如果扩散服务器需要断开离散客户端的连接,则会对XHR轮询客户端的受众进行娱乐。

相关问题