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的。