我正在读书RPC模型 http://www.rabbitmq.com/tutorials/tutorial-six-java.html在 AMQP 中使用 RabbitMQ。本教程创建了一个临时队列,并且还correlationId
。临时队列是唯一的,那么为什么我们需要correlationId呢?我是一名 JMS 人员,在 JMS 中我们通过两种方式进行请求/响应:
为每个请求/响应创建临时队列
创建一个响应队列并使用correlationId
和消息选择器。
有人可以解释为什么我们需要临时队列和correlationId
在AMQP RPC模型中?看来AMQP没有消息选择器之类的东西。我对吗?
正确的,临时队列对于发出 RPC 请求的客户端来说是唯一的。我们可以创建 RPC 客户端,为它发出的每个唯一请求提供一个唯一的队列,但这效率很低 - 请参阅 CorrelationId 的第一段here http://www.rabbitmq.com/tutorials/tutorial-six-python.html:
在上面介绍的方法中,我们建议为每个 RPC 请求创建一个回调队列。这是相当低效的,但幸运的是有一个更好的方法 - 让我们为每个客户端创建一个回调队列。
因此,更好的方法是使用一个队列,RPC 客户端可以在该队列上获取响应,并使用correlationId 将 RPC 客户端发出的请求与 RPC 服务器发回的结果进行匹配。
...在该队列中收到响应后,尚不清楚该响应属于哪个请求。这就是使用correlation_id属性的时候。我们将为每个请求将其设置为唯一值。稍后,当我们在回调队列中收到消息时,我们将查看此属性,并基于此我们将能够将响应与请求相匹配。如果我们看到未知的correlation_id值,我们可以安全地丢弃该消息——它不属于我们的请求。
因此,请参考RPC教程 http://www.rabbitmq.com/tutorials/tutorial-six-python.html:
- 当客户端启动时,它会创建一个独占且唯一的队列
- 当它发送 RPC 请求时,它会设置作为队列名称的reply_to(以便服务器知道将响应发送到哪个队列),并设置一个correlationId,它是每个 RPC 请求的唯一值
- 请求被发送到RPC队列
- RPC工作线程(或服务器)接收请求并处理它,然后使用reply_to值将响应发送回客户端,它还设置correlationId
- RPC 客户端等待响应,当它收到响应时,使用correlationId 来MATCH请求的响应
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)