RabbitMQ shovel 插件是否保留消息顺序?

Does the RabbitMQ shovel plugin preserve message ordering?

我使用 RabbitMQ 铲插件(动态铲,见下文)通过不可靠的 WAN 在两个 RabbitMQ 代理之间提供单向消息传递 link。我在 RabbitMQ 服务器日志中看到经常连接丢失。

两个代理的 AMQP 设置的相关部分是相同的:一个交换器(扇出,持久)和一个队列(持久)。消费应用程序要求消息的接收顺序与发送端生成的顺序相同。

观察到的行为似乎表明情况并非如此,可能是由于重传等原因。RabbitMQ shovel 插件是否保留消息顺序而不会丢失消息?需要哪些配置选项?

为确保消息排序,应配置以下参数:

 "prefetch-count" : 1
 "ack-mode"       : "on-confirm"

prefetch-count 任何时候通过铲子复制的未确认消息的最大数量。默认值为 1000。

ack-mode 确定铲子应如何确认消息。如果设置为 on-confirm(默认值),则消息在目标确认后会向源代理确认。这可以在不丢失消息的情况下处理网络错误和代理故障,并且是最慢的选项。如果设置为 on-publish,则消息在目标位置发布后会向源代理确认。这可以在不丢失消息的情况下处理网络错误,但在代理发生故障时可能会丢失消息。如果设置为 no-ack,则不使用消息确认。这是最快的选项,但在网络或代理出现故障时可能会丢失消息。

更多关于RabbitMQ的shovel机制请参考官方文档:https://www.rabbitmq.com/shovel-dynamic.html