首页 > 解决方案 > 动态铲除节点间消息的确认

问题描述

我知道 Rabbit MQ 支持发布者确认机制——代理对发布者的确认。文档指出,代理在处理消息时通过在设置为“确认模式”的通道上发送 basic.ack 来确认消息。这种通信是在代理和发布者客户端之间进行的。

假设我在另一个数据中心有一个主节点 A 和一个辅助节点 B,并且从 A 到 B 设置了动态 shoveling。根据文档,“ack-mode”决定了 shovel 如何确认消息。如果设置为 on“on-confirm”,则消息在目标(代理 B)确认后向源代理(A)确认。

我想问一下这两种机制是否相互关联(或者它们是否可以相互关联)。当连接到节点 A 的客户端收到确认时,这是否意味着消息也已发布到节点 B(如果 ack-mode=on-confirm)?

标签: rabbitmq

解决方案


不,这些是没有连接的,如果是动态铲子,就会出现ack-mode,它是铲子的配置参数之一。它可以取三个可能的值,它们是

  • 确认
  • 出版时
  • 无应答

这就是它的工作原理。

ack-mode确定铲子应如何确认消息。如果设置为on-confirm(默认值),则消息在目标确认后向源代理确认。这可以在不丢失消息的情况下处理网络错误和代理故障,并且是最慢的选项。

如果设置为on-publish,则消息在目标发布后会向源代理确认。这可以在不丢失消息的情况下处理网络错误,但在代理失败的情况下可能会丢失消息。

如果设置为no-ack,则不使用消息确认。这是最快的选择,但在网络或代理失败的情况下可能会丢失消息。


推荐阅读