Netty - writeAndFlush和消息订购

Netty - writeAndFlush和消息订购

问题描述:

我试图实现使用Netty作为通信协议的分布式actor模型 - 具有TCP连接的NIO版本。假设我们有2个节点(机器),每个节点都有Netty的服务器实例,将传入的消息传递给该节点上的角色。 我想保持同一对远程参与者的消息排序,所以我的解决方案是使用异步writeAndFlush方法向远程节点和参与者发送消息 - 当另一个消息需要在第一个消息发送之前发送给同一个参与者,我会将它添加到缓冲区,并使用writeAndFlush消息的回调,从缓冲区处理下一个。它看起来像这样:Netty - 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是与通道连接2个服务器的实例,我们从A发送 - >乙 - 我的问题是: isSuccess标志意味着什么?什么时候回调实际返回?

当它在A上的最后一个处理程序结束时还是实际上它被传递到B上的第一个处理程序时它会返回吗?

Netty5. Version alpha2。在将数据刷新到socketchannel后,Netty再回调operationComplete方法。在这种情况下,这并不意味着数据到达客户端。这意味着所述数据已被发送到TCP协议stack.You可以在源代码中看到这些:

io.netty.channel.ChannelOutboundBuffer.java 

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