【问题标题】:Netty - writeAndFlush and message orderingNetty - writeAndFlush 和消息排序
【发布时间】:2016-01-15 13:16:12
【问题描述】:

我正在尝试实现使用 Netty 作为通信协议的分布式 Actor 模型 - 带有 TCP 连接的 NIO 版本。

假设我们有 2 个节点(机器),每个节点都有 Netty 的服务器实例,将传入消息传递给该节点上的参与者。 我想保持对同一对远程参与者的消息排序,所以我的解决方案是使用异步 writeAndFlush 方法将消息发送到远程节点和参与者 - 当需要在发送第一条消息之前将另一条消息发送给同一个参与者时,我会将它添加到缓冲区,并通过 writeAndFlush 消息的回调,处理缓冲区中的下一个消息。它看起来像这样:

   channel.writeAndFlush(message).addListener(new MessageListener(mailboxOfSelector));

回调方法是:

    @Override
    public void operationComplete(ChannelFuture future) throws Exception {

        Queue<RemoteMessage> unsentToMailbox = unsentMessages.get(mailboxOfSelector);

        if (!unsentToMailbox.isEmpty()) {
            RemoteMessage message = unsentToMailbox.poll();
            channel.writeAndFlush(message).addListener(this);
        }
    }

因此,如果 A 和 B 是与 Channel 连接的 2 个服务器实例,并且我们从 A -> B 发送 - 我的问题是:isSuccess 标志的深度是什么意思?回调何时真正返回?

它是在 A 上的最后一个处理程序完成时返回,还是在实际交付给 B 上的第一个处理程序时返回?

【问题讨论】:

    标签: java netty actor


    【解决方案1】:

    Netty5. Version alpha2。将数据刷入socketchannel后,Netty回调 operationComplete 方法,此时并不代表数据到达客户端。这意味着数据已经发送到 TCP 协议栈。您可以在源代码中看到这些:

    io.netty.channel.ChannelOutboundBuffer.java
    

    它会从remove()方法或remove(Cause cause)调用promise.trySuccess(),女巫可以触发operationComplete()方法。

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多