RPC模型中的correlationId和临时队列 - AMQP

时间:2012-09-20 08:14:25

标签: rabbitmq rpc amqp

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

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

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

  3. 有人可以解释为什么我们在AMQP RPC模型中需要临时队列和correlationId?似乎AMQP没有像消息选择器那样的东西。我是对的吗?

1 个答案:

答案 0 :(得分:7)

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

  

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

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

  

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

所以引用RPC tutorial的摘要部分:

  • 当客户端启动时,它会创建一个独有且唯一的队列
  • 当它发送RPC请求时,它设置reply_to,这是队列名称(因此服务器知道要向哪个队列发送响应),并且还设置了correlationId,它是每个RPC请求的唯一值。
  • 将请求发送到RPC队列
  • RPC工作者(或服务器)接收请求进程然后使用reply_to值将响应发送回客户端,它还设置了correlationId
  • RPC客户端等待响应,当收到响应时,使用correlationId MATCH 响应请求