我試圖實現使用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上的第一個處理程序時它會返回嗎?