【发布时间】: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 上的第一个处理程序时返回?
【问题讨论】: