让我们暂时接受一下,实现RPC over消息队列(如RabbitMQ)并不是一个可怕的想法 - 有时在与遗留系统接口时可能是必要的.
在RPC over RabbitMQ的情况下,客户端向代理发送消息,代理将消息路由到工作者,工作者通过代理将结果返回给客户端.但是,如果一个worker实现了多个远程方法,那么不同的调用需要路由到不同的监听器.
这种情况下的一般做法是什么?所有RPC over MQ示例仅显示一个远程方法.将方法名称设置为路由规则/队列名称会很好很容易,但我不知道这是否是正确的方法.
Der*_*ley 14
让我们暂时接受一下,实现RPC over消息队列(如RabbitMQ)并不是一个可怕的想法
它根本不可怕!它很常见,并且在许多情况下推荐 - 不仅仅是传统集成.
...好的,现在你的实际问题:)
从非常高的角度来看,这是你需要做的.
您的请求和响应需要有两个关键信息:
correlation-idreply-to队列这些信息将允许您关联原始请求和响应.
让您的请求代码为自己创建一个独占队列.此队列将用于接收回复.
创建新的关联ID - 通常是GUID或UUID以保证唯一性.
将生成的关联ID附加到消息属性.有一个correlationId属性,你应该用于此.
将相关id与请求的关联回调函数(回复处理程序)一起存储,该代码位于发出请求的代码内部.当回复进来时你需要这个.
将您创建的独占队列的名称附加到replyTo邮件的属性中.
完成所有这些后,您可以通过rabbitmq发送消息
回复代码需要使用原始邮件中correlationId的replyTo字段和字段.所以一定要抓住那些
回复应该直接发送到replyTo队列.不要通过交换使用标准发布.相反,使用您正在使用的任何库的"发送到队列"功能将回复消息直接发送到队列,并将响应直接发送到replyTo队列.
一定要包括correlationId在回复中.这是回答你问题的关键部分
发出原始请求的代码将从replyTo队列中接收消息.然后它将拉出correlationId消息属性.
使用相关id来查找请求的回调方法...处理响应的代码.将消息传递给这个回调方法,你已经完成了很多工作.
从高层次的角度来看,这是有效的.当您深入了解代码时,实现细节将根据您使用的语言和驱动程序/库而有所不同.
对于任何给定语言,大多数优秀的RabbitMQ库都会内置请求/响应.如果您没有,您可能想要寻找不同的库.除非您在AMQP协议之上编写基于模式的库,否则您应该寻找具有为您实现的通用模式的库.
如果您需要有关请求/回复模式的更多信息,包括我在此处提供的所有详细信息(以及更多信息),请查看以下资源:
如果你在Node.js工作,我建议使用iscally库,其中包括你需要的请求/回复功能.对于Ruby,请查看bunny.对于Java或.NET,请查看一些服务总线实现.在.NET中,我推荐使用NServiceBus或MassTransit.