Rabbitmq 关联id和传递标签之间的区别是什么

Rabbitmq 关联id和传递标签之间的区别是什么,rabbitmq,message-queue,Rabbitmq,Message Queue,我一直在寻找一个很好的解释来解释这两者之间的区别, 但并没有真正找到一个 我现在知道的是: 关联id是一个字符串(Guid已转换为字符串),传递标记是一个int。 相关id对于每条消息都是唯一的,而传递标记仅在 通道(通道就是作用域) 那很好……但是目的有什么不同呢?为什么一条消息需要两个标识符?当我想看到一个同步行为时,通常在RabbitMQ的上下文中使用相关ID,在同步行为中发送一条消息,另一个发送者将发送响应,但在回复标记中会有correlationID。在RabbitMQ中复制的常见模式

我一直在寻找一个很好的解释来解释这两者之间的区别, 但并没有真正找到一个

我现在知道的是: 关联id是一个字符串(Guid已转换为字符串),传递标记是一个int。 相关id对于每条消息都是唯一的,而传递标记仅在 通道(通道就是作用域)


那很好……但是目的有什么不同呢?为什么一条消息需要两个标识符?

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

然而,Delivery标记是每个通道消息传递的指示器,通常在遵循已确认的传递模型时出现


两者的用途完全不同,并非消息标识符。

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

送货标签
  • AMQP通信层的一部分,内置于RabbitMQ本身
  • 示例用法:并且可以在代理(RabbitMQ服务器)上永久丢弃
  • 在开放频道内为每一条发送的邮件自动分配
  • 必须在该通道内唯一,协议才能正常运行。在不同的通道中不需要是唯一的,因此简单的递增整数很容易实现
  • 同一消息可能在不同的时间使用不同的传递标签传递,甚至存在于多个队列中,并同时传递给不同的消费者
相关ID
  • 使用RabbitMQ的应用程序逻辑的一部分,而不是代理本身
  • 示例用法:在两条单独的消息上使用匹配的相关ID和“reply to”,应用程序希望将其视为RPC模式中的请求和响应
  • 需要在首次创建消息时手动添加,并且是可选的
  • 协议不能保证它是唯一的,它只是将它视为一个任意字符串。这取决于应用程序以不太可能与其用例发生冲突的方式生成,例如UUID的适当形式
  • 无论消息被转发或复制到多个队列中多少次,每次传递消息时都将保持不变

感谢您在马尼尔巴的回答。您写道“另一个发件人将发送响应”。据我所知,消费者在RPC中发送响应,而不是另一个发送者。我还不明白的是,为什么不使用相关Id进行确认呢?如果我们已经有了一个标识符(关联id),那么为什么不使用它呢。@SItzik作为“消费者”在不同的上下文中有不同的含义。这个答案中提到的“其他发送者”是“消费者”,因为它可能是相同的应用程序;但就RabbitMQ而言,它并没有连接到订阅原始队列的“消费者”,它只是另一个发布者。@IMSoP感谢您的澄清。感谢您的回答IMSoP。您在文章中提到了交付标签:“同一封邮件可能在不同的时间使用不同的交付标签交付”。您曾写过相关Id:“每次发送消息时都会保持不变”。由此……我可以得出结论,如果消费者想要验证它现在收到的消息过去没有收到,它需要读取消息的相关ID,而不是消息的传递标签,并将其与它过去已经收到的消息的相关ID进行比较。正确吗?@SItzik是的,这将是对相关ID的合理使用。在特定情况下,消息在被前一个消费者拒绝或未确认后重新传递,它还将具有“重新传递”标志,但我可以想象更复杂的场景,在应用程序级别检查相关ID是有意义的。那么,为什么交付标记“用于确认”之类的事情呢?。我的意思是,如果使用者想要通知发送者它收到了一条特定的消息,为什么不为此目的使用相关Id?@SItzik的“确认”,我的意思是消费者进程告诉RabbitMQ服务器它已在协议级别收到消息,与消息的“发送者”无关。RabbitMQ服务器不能依赖唯一的关联ID,甚至不能依赖提供的关联ID,因此不能将其用于此目的。@SItzik我编辑了答案,试图使区别更清楚。