0

我有一个 Netty 客户端将消息异步发送到 TCP Netty 服务器。

为了保持服务器ChannelPipeline具有的顺序并ExecutionHandlerOrderedMemoryAwareThreadPoolExecutor.

我的理解是发送到服务器的消息在通道中排队。如果服务器在消息在通道中排队时死机,我需要防止消息丢失。

我目前的解决方案是将每条消息添加到客户端的队列中,并且仅当我从服务器收到每条消息的 Ack 消息时才将它们从队列中删除。你怎么看?

4

1 回答 1

1

您的建议相当普遍,有时被称为发送窗口。我以前使用过类似的技术,尽管我将发送的消息存储在地图中,因为服务器理论上可以处理并确认它们是无序的。

TCP 使用类似的技术,SMPP 之类的协议甚至允许异步发送的 JMS 提供程序(例如hornetQ)也使用类似的技术。HTTP 流水线是类似的,尽管它确实需要按顺序处理和确认请求。

您必须考虑的一件事是服务器如何处理重新传输的消息。它可能已经处理了原始消息,但 ack 在到达您的客户端之前丢失了。例如,如果消息请求某种付款,您不想因为确认丢失而向该人收取两次费用。

于 2012-11-22T12:18:45.577 回答