排队消息以防止服务器故障

时间:2012-11-19 18:15:20

标签: netty

我有一个Netty客户端以异步方式向TCP Netty服务器发送消息。

为了保留服务器ChannelPipeline具有的ExecutionHandlerOrderedMemoryAwareThreadPoolExecutor的订单。

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

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

1 个答案:

答案 0 :(得分:1)

您所建议的内容相当普遍,有时也称为发送窗口。我之前使用过类似的技术,虽然我将发送的消息存储在地图中,因为服务器理论上可以处理并确认它们不按顺序。

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

您必须考虑的一件事是服务器对重新传输的消息做了什么。它可能已经处理了原始邮件但是ack在到达您的客户端之前就丢失了。例如,如果邮件要求支付某种类型的付款,则您不希望向该人收取两次费用,因为该请求已丢失。