我正在我们的生产前环境中测试一个扩散解决方案。该解决方案允许匿名客户在进行身份验证或断开连接之前获得10分钟的免费访问。这在开发和早期测试中很好,但是在预生产中,当一个客户端断开连接时,我们会看到许多其他客户端同时断开连接而没有任何原因。一旦日志被设置为最精益求精,日志文件就会说:
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。
发布于 2016-03-21 16:07:39
我猜您的生产前环境有一个负载均衡器,它被设置为使用连接池。v10之前的IE版本不支持WebSockets,因此它们将使用XHR长轮询。您的智能手机客户端也将使用WebSockets,因此将不受影响。
手册在“使用负载平衡器时的注意事项”部分有这样的说明
不要为负载均衡器和扩散服务器之间的连接使用连接池。如果多个客户端连接通过单个服务器端连接进行多路复用,则会导致客户端连接过早关闭。
在扩散中,客户端在该连接的生存期内与单个TCP/HTTP连接相关联。如果扩散服务器关闭客户端,则连接也将关闭。扩散不区分单个客户端连接和多路连接,因此当共享多路复用连接的客户端关闭时,负载均衡器和扩散之间的连接被关闭,随后通过该服务器端连接复用的所有客户端连接都被关闭。
来说明这个问题。当扩散服务器与观众Alice、Bob和Charlie直接连接时,关闭Bob的连接是直接的

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

所以,虽然连接池对于常规的HTTP来说是个好主意,但是如果它需要断开离散客户端的连接,那么对于让XHR轮询客户的听众感兴趣的扩散服务器来说,这是个问题。
https://stackoverflow.com/questions/36134541
复制相似问题