【问题标题】:correlationId and temporary queues in RPC model - AMQPRPC 模型中的correlationId 和临时队列 - AMQP
【发布时间】:2012-09-12 13:53:48
【问题描述】:

我正在使用 RabbitMQ 在 AMQP 中阅读 RPC-Model。本教程创建了一个临时队列以及correlationId。临时队列是唯一的,那我们为什么需要correlationId呢?我是 JMS 人,在 JMS 中,我们通过两种方式请求/响应:

  1. 为每个请求/响应创建临时队列

  2. 创建一个响应队列并使用correlationId 和消息选择器。

有人能解释一下为什么我们在 AMQP RPC 模型中需要临时队列和 correlationId 吗?似乎 AMQP 没有消息选择器之类的东西。我说的对吗?

【问题讨论】:

    标签: rabbitmq rpc amqp


    【解决方案1】:

    正确的临时队列对于发出 RPC 请求的客户端来说是唯一的。我们可以创建 RPC 客户端,为其发出的每个唯一请求创建一个唯一队列,但这效率低下 - 请参阅 CorrelationId here 的第一段:

    在上面介绍的方法中,我们建议为每个 RPC 请求创建一个回调队列。这非常低效,但幸运的是有一个更好的方法 - 让我们为每个客户端创建一个回调队列。

    因此,一种更好的方法是让 RPC 客户端获取响应并使用correlationId 将 RPC 客户端发出的请求与 RPC 服务器发回的结果相匹配。

    ...在该队列中收到响应后,尚不清楚该响应属于哪个请求。这就是使用correlation_id 属性的时候。我们将为每个请求将其设置为唯一值。稍后,当我们在回调队列中收到一条消息时,我们将查看此属性,并基于此将响应与请求进行匹配。如果我们看到未知的 correlation_id 值,我们可以安全地丢弃该消息 - 它不属于我们的请求。

    所以参考RPC tutorial的摘要部分:

    • 当客户端启动时,它会创建一个独占且唯一的队列
    • 当它发送一个 RPC 请求时,它会设置队列名称的 reply_to(这样服务器就知道要向哪个队列发送响应)并设置一个correlationId,它是每个 RPC 请求的唯一值
    • 请求被发送到 RPC 队列
    • RPC 工作者(或服务器)收到请求并处理它然后使用 reply_to 值将响应发送回客户端,它还设置了相关 ID
    • RPC 客户端等待响应,并在收到响应时使用correlationId 将响应与请求MATCH

    【讨论】:

    • 丢弃不匹配的消息如何安全?期待响应的请求者呢?该消息现在丢失了,因为其他东西从队列中消耗了它并将其丢弃。如果您的客户端是 Web 服务器并跨线程传播并行请求,则可能会发生这种情况。在那种情况下,如何保证消息不会被消费者丢弃?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2013-08-08
    • 1970-01-01
    • 2018-08-08
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多