我有一个Netty客户端以异步方式向TCP Netty服务器发送消息。
为了保留服务器ChannelPipeline
具有的ExecutionHandler
和OrderedMemoryAwareThreadPoolExecutor
的订单。
我的理解是发送到服务器的消息在通道中排队。如果服务器在通道排队的消息中死亡,我需要防止消息丢失。
我目前的解决方案是将每条消息添加到客户端的队列中,并且当我从服务器收到每条消息的Ack消息时,只将它们从队列中删除。你觉得怎么样?
答案 0 :(得分:1)
您所建议的内容相当普遍,有时也称为发送窗口。我之前使用过类似的技术,虽然我将发送的消息存储在地图中,因为服务器理论上可以处理并确认它们不按顺序。
TCP使用类似的技术,如SMPP等协议,甚至允许异步发送的JMS提供程序(例如hornetQ)。 HTTP流水线操作类似,但确实需要按顺序处理和确认请求。
您必须考虑的一件事是服务器对重新传输的消息做了什么。它可能已经处理了原始邮件但是ack在到达您的客户端之前就丢失了。例如,如果邮件要求支付某种类型的付款,则您不希望向该人收取两次费用,因为该请求已丢失。