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

Posted

技术标签:

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

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

任何想法将不胜感激

谢谢

【问题讨论】:

【参考方案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 类。

【讨论】:

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

以上是关于Netty:如何限制每秒 websocket 通道消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 websocket 检查消息是不是真的在 Netty 中传递?

netty,websocket,ipc(lpc和rpc),Nio之间的相互调用

netty实现websocket请求实战

gateway网关中netty的websocket设置数据内容大小

了解 netty 通道缓冲区和水印

2020-06-18 面试:netty最多可以支持多少个websocket 长连接