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 指标库。
我需要限制 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 指标库。