Java Netty-writeAndFlush和消息排序

Java Netty-writeAndFlush和消息排序,java,netty,actor,Java,Netty,Actor,我正在尝试实现分布式参与者模型,该模型使用Netty作为通信协议——具有TCP连接的NIO版本 假设我们有2个节点(机器),每个节点都有Netty的服务器实例,它们将传入的消息传递给该节点上的参与者。 我希望为同一对远程参与者保持消息顺序,因此我的解决方案是使用异步writeAndFlush方法将消息发送到远程节点和参与者-当在第一条消息交付之前需要向同一参与者发送另一条消息时,我会将其添加到缓冲区,并回调writeAndFlush消息,处理缓冲区中的下一个。看起来是这样的: channe

我正在尝试实现分布式参与者模型,该模型使用Netty作为通信协议——具有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);
        }
    }
@覆盖
public void operation complete(ChannelFuture future)引发异常{
Queue unsentToMailbox=unsentMessages.get(mailboxOfSelector);
如果(!unsentToMailbox.isEmpty()){
RemoteMessage message=unsentToMailbox.poll();
channel.writeAndFlush(message).addListener(this);
}
}
所以,如果A和B是两个与通道连接的服务器实例,我们从A->B发送,我的问题是:isSuccess标志在深度上意味着什么?回调什么时候真正返回


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

Netty5中。alpha2版本
。在将数据刷新到socketchannel之后,Netty然后回调operationComplete方法。在这种情况下,这并不意味着数据到达了客户端。这意味着数据已发送到TCP协议栈。您可以在源代码中看到:

io.netty.channel.ChannelOutboundBuffer.java
它将从
remove()
方法或
remove(Cause-Cause)
调用
promise.trysucces()
,该开关可以触发
operationComplete()
方法