【发布时间】:2018-04-02 11:34:01
【问题描述】:
我需要限制 netty 服务器每秒在 websocket 通道上接收的消息。 找不到任何想法如何做到这一点。
任何想法将不胜感激
谢谢
【问题讨论】:
我需要限制 netty 服务器每秒在 websocket 通道上接收的消息。 找不到任何想法如何做到这一点。
任何想法将不胜感激
谢谢
【问题讨论】:
您需要将简单的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 类。
【讨论】: