基于AMQP实现RPC(Remote Procedure Call)的设计

基于AMQP实现RPC(Remote Procedure Call)的设计
guibin.beigjing@gmail.com

首先回忆一下RPC的过程。客户端将请求发送给服务器端,服务器端处理完毕之后将结果返回给客户端。那么在AMQP之上,如何实现RPC呢?客户端应当将请求publish给服务器端,服务器处理完毕之后,再将结果publish回给客户端。在这过程中有两次publish,显然应该是不同的publish。服务器端publish的消息,客户端不应该收到更不应该消费;给客户端publish的结果消息,应该只有客户端能收到;并且对于每次请求和相应,都应该有一组唯一的标识,标识并匹配相应的一对请求和响应,防止由于多次请求而收到多次响应,混淆了请求和响应之间的对应关系。

基于AMQP实现RPC的逻辑如下图所示:
[img]http://dl.iteye.com/upload/attachment/421822/d212cdd3-5ab5-3e35-85c0-830f9799c706.png[/img]

[list]
[*]服务器S提前建好一个专门接受来自客户端RPC请求的队列rpc_queue,并且客户端知道如何向此队列publish消息的rountingKey。通常情况下会建立一个和该接受请求的队列同名的rountingKey,并和该rpc_queue绑定。这样客户端向rountingKey发送请求后,服务器端就能收到请求了。
[*]当客户端C启动的时候,生成一个匿名的、排他的、自动删除的回调队列(an anonymous, exclusive and auto delete callback queue),用来接受来自服务器端的响应。
[*]对于一个PRC请求而言,客户端发送的消息必须包含两个属性“ reply_to”和“ correlation_id”。“reply_to”用来告诉服务器端计算后的结果发送到哪个rountingKey,“correlation_id”用做每个请求的唯一标识,以区分不同请求和不同响应。
[*]客户端C将请求publish到rpc_queue,图中上面从左向右的过程。
[*]服务器端S在监听队列rpc_queue,收到了来自客户端的请求之后,处理并得到结果,将结果包装成响应消息,publish给“reply_to”。
[*]客户端C一直在监听“reply_to”队列,收到了结果消息后,取到消息中的属性“correlation_id”值,如果这个“correlation_id”和之前记录的请求的“correlation_id”相匹配,则确认这个响应是有效的,并将结果返回给调用者。[/list]

基于此设计,用Scala+RabbitMQ的实现源代码,请参考[url=https://github.com/dcaoyuan/aiotrade]AIOTrade[/url]中的lib.amqp包下的[url=https://github.com/dcaoyuan/aiotrade/blob/master/libs/lib.amqp/src/main/scala/org/aiotrade/lib/amqp/RpcClient.scala]RpcClient.scala[/url]和[url=https://github.com/dcaoyuan/aiotrade/blob/master/libs/lib.amqp/src/main/scala/org/aiotrade/lib/amqp/RpcServer.scala]RpcServer.scala[/url]。

参考文献:
[url]http://www.rabbitmq.com/tutorial-six-python.html[/url]
[url]http://www.infoq.com/articles/AMQP-RabbitMQ[/url]

Guibin
2011-02-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值