Netty:如何限制每秒的 websocket 通道消息数?

Netty: How to limit websocket channel messages per second?

我需要限制 netty 服务器每秒在 websocket 通道上接收的消息。 找不到任何想法如何做到这一点。

如有任何想法,我们将不胜感激

谢谢

您需要将简单的 ChannelInboundHandlerAdapter 处理程序添加到您的管道,并将简单的计数器添加到 channelRead(ChannelHandlerContext ctx, Object msg) 方法。为此,我建议您使用一些 CodaHale 指标 Class。

伪代码:

private final QuotaLimitChecker limitChecker;

public MessageDecoder() {
    this.limitChecker = new QuotaLimitChecker();
}


@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) {
    if (limitChecker.quotaReached(100)) { //assume limit is 100 req per sec
        return;
    }
}

其中 QuotaLimitChecker 是一个 class 递增计数器并检查是否达到限制。

public class QuotaLimitChecker {

    private final static Logger log = LogManager.getLogger(QuotaLimitChecker.class);

    private final int userQuotaLimit;
    //here is specific implementation of Meter for your needs
    private final InstanceLoadMeter quotaMeter;

    public QuotaLimitChecker(int userQuotaLimit) {
        this.userQuotaLimit = userQuotaLimit;
        this.quotaMeter = new InstanceLoadMeter();
    }

    public boolean quotaReached() {
        if (quotaMeter.getOneMinuteRate() > userQuotaLimit) {
            log.debug("User has exceeded message quota limit.");
            return true;
        }
        quotaMeter.mark();
        return false;
    }

}

Here is my implementation of QuotaLimitChecker that uses the simplified version Meter class CodaHale 指标库。