Request-Reply pattern:http://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReply.html
之前研究的生产者/消费者模式都是单向的,生产者生产message,消费者消费message
RPC则是双向的,消费者消费完message,返回result给生产者。
这样,就存在两套生产者/消费者模式,生产者既是response的消费者,消费者既是response的生产者。
整个正常的流程如下:
producer-----request message(responseQueue and correlationId)-----exchangeA-----通过routingkeyA------rpc_queue-----consumer------response message(correlationId)----exchangeB-----通过routingkeyB-----responseQueue-----producer
diagram:
http://www.enterpriseintegrationpatterns.com/img/RequestReply.gif
什么叫RPC? 以及解决的应用场景:run a function on a remote computer and wait forthe result? Well, that's a different story. This pattern is commonlyknown as Remote Procedure Call or RPC.
为了使rabbitmq支持RPC,有两点需要注意,解决问题的关键:
1. callback queue:
这个参数的作用是当consumer处理完message之后,把result放到callback queue里面,这样producer就能访问及处理
这个参数是谁传的,以及咋传过去的: producer在publish message所带的一个参数
如下例子:
callbackQueueName = channel.queueDeclare().getQueue();
BasicProperties props = new BasicProperties
.Builder()
.replyTo(callbackQueueName)
.build();
channel.basicPublish("", "rpc_queue", props, message.getBytes());
Message properties 常用参数解析:
deliveryMode:是否把此message 制成 persisten还是transient
contentType:选json格式:application/json
replyTo:指定callback queue
correlationId:匹配RPC response和对应的request,主要是由于一个client/producer 一般只定义一个callback queue,为了判断哪条response是对应的哪个request而加的。
2. Correlation Id
这是一个单独并且唯一的ID,用来匹配response和request,每一个request都有有个唯一的标识符就是correlationID,当response 返回时,producer可以检测response里面带的correlationID来知道这条response是对应哪条request的。