2016-03-21 172 views
3

我正在测试我们的预生产环境中的Diffusion解决方案。该解决方案为匿名客户提供10分钟的免费访问权限,然后才能进行身份验证或断开连接。这在开发和早期测试中工作正常,但在预生产中,当一个客户端断开连接时,我们看到许多无故同时断开其他客户端。一旦日志记录设置为最佳日志文件说:断开单个客户端的连接会断开许多其他客户端的连接

2016-03-21 11:57:36.557|DEBUG|Diffusion: InboundThreadPool Thread_4||[email protected][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 [email protected]: 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 [email protected]: CONNECTION_LOST keeping alive for 60000 ms.|com.pushtechnology.diffusion.clients.impl.ClientImpl 

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

回答

4

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

手册中有这样一段在第"Considerations when using load balancers"

说不要使用连接池的负载平衡器和扩散服务器之间的连接。如果多个客户端连接通过单个服务器端连接复用,则可能导致客户端连接过早关闭。

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

为了说明问题。当一个扩散过程服务器有它的观众爱丽丝,鲍勃和查理,关闭Bob的连接直接连接是直截了当

Diffusion and audience with no load balancer

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

Diffusion and audience with connection-pooling middlebox

所以,而连接池是常规的HTTP服务器是个好主意,它是弥散服务器招待XHR轮询客户的观众,如果它需要断开离散的客户问题。

相关问题