【问题标题】:How to track exact number of open connections in netty server如何跟踪 netty 服务器中打开的连接的确切数量
【发布时间】:2019-10-27 19:41:47
【问题描述】:

我有一个关于 netty 服务器监控的问题。我想看看有多少到服务器的打开连接,所以我们有一个代码,它有一个原子整数计数器,在 ChannelInitializer.initChannel(..) 方法上增加 1,在 closeFuture 侦听器中减少 1那个 SocketChannel 通道。由于某种我无法弄清楚的原因,它不会归零并且在重负载下保持正数。我希望也许有更好的方法来跟踪这些开放渠道?

  @Override
  protected void initChannel(SocketChannel channel) throws Exception {
          currentConnections.incrementAndGet();
          channel.closeFuture().addListener(f -> currentConnections.decrementAndGet());
  }

更新: 因此,在客户端停止发送流量并断开连接后,该数字保持正数。

【问题讨论】:

  • 重负载下不归零?如果负载很重,为什么会期望没有连接?
  • 没错,我应该说的是,在大量消息爆发之后,当测试停止发送新消息并且客户端终止时,我希望看到 0。
  • 它(很可能)是与 TCP/IP 堆栈相关的thing。基本上连接不会立即关闭,但它会“徘徊”一段时间。这很正常,除非它给您带来问题(资源耗尽),否则无需触摸它。
  • 这是一个很好的解释,但这个数字似乎永远不会下降。
  • 那么你需要它下降有什么原因吗?你为什么要跟踪它?您是否有问题,或者您只是希望它以某种方式运行?

标签: java netty


【解决方案1】:

一种方法是添加ChannelInboundHandler 并覆盖channelRegisteredchannelUnregistered,如下所示:

  @Override
  public void channelRegistered(final ChannelHandlerContext ctx) {
    if (ctx.channel().remoteAddress() != null) {
      connections.inc();
    }
  }

  @Override
  public void channelUnregistered(final ChannelHandlerContext ctx) {
    currentConnections.dec();
  }

另一种方法是仅在注册时将通道添加到ChannelGroup,并在要查询当前连接数时使用ChannelGroup#size

我猜前者会产生较少的开销,但后者允许您在需要此类功能时对所有活动通道执行操作。

【讨论】:

  • 干杯,与 channelActive/Inactive 相比,使用 channelRegistered/Unregistered 有什么优势?
  • 还应该在 channelUnregistered 方法中进行 remoteAddress 检查,这样计数器就不会进入负范围吗?还是发生了一些不需要的事情?
  • 严格来说,根据netty-in-action这本书,我认为如果要监控连接的客户端,使用活动/非活动状态更“正确”。我使用已注册/未注册,因为它代表了整个频道生命周期,它代表了您更正确地持有的资源。我想这两个事件都适合你
  • 缺少远程地址的通道是父通道 - 它不是入站“连接”之一的表示。也许 Norman Maurer 可以更好地解释这一点……
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2019-09-25
  • 2016-07-24
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多