使用netty-socketio服务器限制websockets

我们使用的是https://github.com/mrniko/netty-socketio 。

应用场景:服务器正在通过websocket以高速率将消息推送到客户端。

最近我们遇到了一个问题,即客户端无法处理来自socket.io服务器的所有事件消息。 websocket消息开始堆积,客户端变得没有响应。在Chrome开发人员工具中,我们可以看到客户端的内存逐渐增加。

使用wireshark分析tcpdump表明发生了大量重传,客户端无法应对。

我们计划在服务器端有一个限制机制。是否有任何事件/回调可用于检测慢速客户端,以便我们可以在服务器端为这个特定的websocket启动限制?

是。 Channel.isWritable()是一个很好的起点。 为了简化一点,当在通道的出站缓冲区中有太多未决的出站字节时,它返回false 。 您可以继续发送,直到Channel.isWritable()返回false 。 当通道的可写性发生变化时,会通过channelWritabilityChanged()事件通知您的处理程序。 然后,您可以恢复转移。

 public void generateTraffic(ChannelHandlerContext ctx) { while (ctx.channel().isWritable()) { ctx.write(...); } } public void channelWritabilityChanged(ChannelHandlerContext ctx) { generateTraffic(ctx); } 

在实际应用程序中,您需要维护一些有状态信息以确定何时应发送消息。

另外,请查看ChannelConfig.writeBufferHigh/LowWatermark属性,以配置isWritable()何时应该开始返回falsetrue