3

我已经为这两者之间的区别寻找了一个很好的解释,但并没有真正找到一个。

到目前为止我所知道的是:相关 id 是一个字符串(转换为字符串的 Guid),交付标签是一个 int。每条消息的correlation id都是唯一的,而delivery tag只在channel中是唯一的(channel就是scope)。

没关系....但是目的有什么区别?为什么我们需要一个消息的两个标识符?

4

2 回答 2

1

这两个标识符存在于两个不同的通信概念层中,并且具有在每种情况下有用的不同属性。虽然可以设计一个协议,让一个标识符同时服务于两个目的,但将它们分开可以使两种实现更简单。

交货标签

  • AMQP 通信层的一部分,内置于 RabbitMQ 本身。
  • 使用示例:消费者进程可以确认消息已被处理,并且可以在代理(RabbitMQ 服务器)上永久丢弃。
  • 为每条传递的消息在开放通道内自动分配
  • 在该通道中必须是唯一的,才能使协议正常运行。不需要在不同的通道中是唯一的,所以一个简单的递增整数很容易实现。
  • 相同的消息可能在不同的时间以不同的传递标签传递,甚至存在于多个队列中并同时传递给不同的消费者。

相关 ID

  • 使用 RabbitMQ 的应用程序的部分逻辑,而不是代理本身。
  • 使用示例:在两个单独的消息上使用匹配的相关 ID 和“回复”,应用程序希望将其视为 RPC 模式中的请求和响应。
  • 首次创建消息时需要手动添加,可选。
  • 协议不保证是唯一的,它只是将其视为任意字符串。由应用程序以一种不太可能与其用例发生冲突的方式来生成,例如适当形式的 UUID。
  • 每次传递消息时都将保持不变,无论它被转发或复制到多个队列中多少次。
于 2020-10-19T10:10:36.500 回答
0

Correlation ID 通常在 RabbitMQ 的上下文中使用,当我想查看发送消息的同步行为时,另一个发送者将发送响应,但将在回复标签中具有相关 ID。在 RabbitMQ 中复制的常见模式是 RPC 调用,它更像是同步消息传递。

但是,交付标签是每个通道的消息交付的指标,并且通常在遵循确认交付模型时出现。

两者都有完全不同的目的,并且不是消息标识符。

于 2020-10-18T18:49:29.223 回答