【问题标题】:Netty: How to limit websocket channel messages per second?Netty:如何限制每秒 websocket 通道消息?
【发布时间】:2018-04-02 11:34:01
【问题描述】:

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

任何想法将不胜感激

谢谢

【问题讨论】:

    标签: java websocket netty


    【解决方案1】:

    您需要将简单的ChannelInboundHandlerAdapter 处理程序添加到您的管道,并将简单的计数器添加到channelRead(ChannelHandlerContext ctx, Object msg) 方法。我建议您为此目的使用一些 CodaHale Metrics 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 是一个递增计数器并检查是否达到限制的类。

    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 我对 QuotaLimitChecker 的实现,它使用了 CodaHale Metrics 库的简化版本 Meter 类。

    【讨论】:

    • 谢谢你,这正是我需要的:)