Netty Channel未来表现

Netty ChannelFuture performance

我有一段代码检查 ChannelHandlerContext WriteandFlush 是否成功(以确保在发送下一条消息之前已成功发送消息)

    logger.debug("Writing '" + message + "' to channel now");
    ctx.writeAndFlush(message.getMessage());

    ChannelFutureListener cfl = new ChannelFutureListener() {
      @Override
      public void operationComplete(ChannelFuture future) throws Exception {
        if (future.isSuccess()) {
          // Message was successfully sent
          logger.debug("Message '" + message + "' sent successfully");

我遇到的问题是 operationComplete 在 writeandflush 之后只用了一秒多一点,这会降低我的服务器性能。 有人知道为什么要花这么长时间吗?

在继续之前以这种方式检查写入和刷新是否成功是最佳做法吗?

在异步框架中处理消息的最佳方式就是发送消息。 Netty 将处理消息并使它们以正确的顺序到达。

在调用 ChannelFutureListener 之前花费这么长时间的原因是因为 Netty 只会在写入 + 刷新完全成功时调用它。发生这种情况时,会发生以下情况:

  1. 你打电话给writeAndFlush
  2. Netty 将其写入底层管道(快速)
  3. Netty 刷新整个管道(快速)
  4. Flush return 如果数据已经到达另一个端点则成功,这可能需要一些时间
  5. 然后你的监听器被调用

这种方式的好处是在监听器被调用的那一刻你就知道对方已经完全接收到了数据,此时调用close等方法是安全的。

如果你想将多个数据包发送到同一个连接,而不是重复调用 writeAndFlush,你应该为每个数据包调用 write,然后发送一个 flush() 调用在最后一个数据包之后,这样所有数据包将被同时处理。