使用netty-socketio服务器限制websockets

时间:2015-03-04 18:57:58

标签: java websocket socket.io netty

我们正在使用https://github.com/mrniko/netty-socketio

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

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

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

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

1 个答案:

答案 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()开始返回falsetrue时进行配置。