我们正在使用https://github.com/mrniko/netty-socketio。
应用场景:服务器正在通过websocket以高速率将消息推送到客户端。
最近我们遇到了客户端无法处理来自socket.io服务器的所有事件消息的问题。 websocket消息开始堆积,客户端没有响应。在Chrome开发人员工具中,我们可以看到客户端的内存逐渐增加。
使用wireshark分析tcpdump表明发生了大量重传,客户端无法应对。
我们计划在服务器端有一个限制机制。是否有任何事件/回调可用于检测慢速客户端,以便我们可以在服务器端为这个特定的websocket启动限制?
答案 0 :(得分:2)
是。 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()
开始返回false
或true
时进行配置。