【问题标题】:What is the difference between correlation id and delivery tag相关 ID 和交付标签有什么区别
【发布时间】:2020-10-18 15:32:59
【问题描述】:

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

到目前为止,我所知道的是: 相关 id 是一个字符串(转换为字符串的 Guid),交付标签是一个 int。 相关 id 对于每条消息都是唯一的,而传递标签仅在 频道(频道是作用域)。

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

【问题讨论】:

    标签: rabbitmq message-queue


    【解决方案1】:

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

    交付标签

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

    相关 ID

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

    【讨论】:

    • 感谢 IMSoP 的回答。您写过关于传递标签的文章:“同一条消息可能会在不同的时间使用不同的传递标签传递”。您写了有关相关 ID 的文章:“每次传递消息时都将保持不变”。由此....我可以得出结论,如果消费者想要验证它现在收到的消息,过去没有收到,它需要读取消息的 CORRELATION ID,而不是消息的 DELIVERY TAG,并将其与过去已经获得的消息的相关 ID 进行比较。对吗?
    • @SItzik 是的,这将是对关联 ID 的合理使用。在消息被前一个消费者拒绝或未确认后重新传递的特定情况下,它也会有一个“重新传递”标志,但我可以想象更复杂的场景,检查相关 ID 是有意义的在应用程序级别。
    • 好吧,那么为什么交付标签是“用于诸如确认之类的事情”?我的意思是,如果消费者想要通知发送者,它收到了一条特定的消息,为什么不为此目的使用相关 ID?
    • @SItzik 通过“确认”,我的意思是消费者进程告诉 RabbitMQ 服务器它已收到消息,在协议级别,与消息的“发送者”无关。 RabbitMQ 服务器不能依赖唯一的关联 ID,甚至根本无法提供,因此不能将其用于此目的。
    • @SItzik 我已经编辑了答案以尝试使区别更清晰。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答 Atmanirbhar。您写道“作为回应,另一位发件人将发送回复”。据我所知,消费者在 RPC 中发送响应,而不是另一个发送者。我还没有理解的是,为什么不将相关 ID 也用于确认?如果我们已经有了一个标识符(correlation id),那么为什么不使用它呢。
    • @SItzik As noted in the RabbitMQ manual "consumer" 在不同的上下文中意味着不同的东西。这个答案中提到的“其他发件人”是“消费者”,因为它可能是同一个应用程序进程;但就RabbitMQ而言,它并没有连接到订阅原始队列的“消费者”,它只是另一个发布者。
    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2011-08-13
    • 1970-01-01
    • 2019-10-14
    • 2023-03-13
    • 2010-12-28
    • 2012-08-15
    • 2012-12-27
    相关资源
    最近更新 更多