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

Maj*_*imi 4 rpc amqp rabbitmq

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

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

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

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

kzh*_*hen 7

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

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

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

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

所以引用RPC教程的Summary部分:

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