【问题标题】:Netty ChannelFuture performanceNetty ChannelFuture 性能
【发布时间】:2016-03-02 23:19:30
【问题描述】:

我有一段代码检查 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 之后只需要一秒钟多一点,这正在扼杀我的服务器性能。 有人知道为什么要花这么长时间吗?

在继续之前以这种方式检查 writeandflush 是否成功是最佳实践?

【问题讨论】:

    标签: netty


    【解决方案1】:

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

    调用 ChannelFutureListener 需要这么长时间的原因是,Netty 只会在 write + flush 完全成功时调用它。发生这种情况时,会发生以下情况:

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

    这种方法的优点是你知道对方在监听器被调用的那一刻已经完全接收到数据,并且在那一刻调用像close这样的方法是安全的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 2020-03-16
      相关资源
      最近更新 更多