2012-09-20 77 views
4

我在使用RabbitMQ读取AMQP中的RPC-Model。本教程创建了一个临时队列,也是correlationId。临时队列是唯一的,那么为什么我们需要correlationId?我是一个JMS的家伙,在JMS我们做的请求/响应方式有两种:RPC模型中的correlationId和临时队列 - AMQP

  1. 为每个请求/响应

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

有人可以解释为什么我们在AMQP RPC模型既需要临时队列和correlationId?看起来AMQP没有类似消息选择器的东西。我对吗?

回答

6

正确的临时队列对于发出RPC请求的客户端是唯一的。我们可以创建RPC客户端有它使每一个独特的请求,唯一的队列,但是这将是低效的 - 看到的correlationID here第一款规定:

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

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

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

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

    当客户机启动时把它发送它设置REPLY_TO这是队列名称的RPC请求它创建一个独特和唯一队列
  • (所以服务器知道哪个队列发送响应),并且还设置correlationId,它是每个RPC请求的唯一值,该请求被发送到RPC队列
  • RP C工作人员(或服务器)接收请求进程,然后使用reply_to值将响应发送回客户端,同时还设置correlationId RPC客户端等待响应,并且当它收到一个响应时使用对号到MATCH对请求的回应