rabbitmq之RPC(remote procedure call)

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章