##Remote procedure call
在第二节,我们学习了怎么使用Work Queues 来分发耗时任务给多个Workder。
但是如果我们需要在远程电脑运行一个 function,我们应该怎么获得result。这种模式通常被称为远程过程调用或RPC。
在这一节,我们会使用RabbitMQ来创建一个RPC system:一个client和一个RPC Server。
##Client interface
为了阐明RPC service 是怎么使用的,我们会创建一个简单的client类,它会暴露一个方法,名字叫`call`,它会发送一个RPC请求并且阻塞程序,直到answer被接受。
```
var rpcClient=new RPCClient();
Console.WriteLine(" [x] Requesting fib(30)");
var response=rpcClient.Call("30");
Console.WriteLine(" [.] Got {0}",response);
rpcClient.Close();
```
**A note on RPC**
尽管RPC 是一种很常见的模式,但是它是有争议的。主要问题是:程序不知道函数调用是本地还是一个缓慢的RPC。
##Callback queue
通常通过该RabbitMQ 实现RPC是很简单的。一个Client发送一个请求信息,一个Server返回响应信息。为了接收这个反馈信息,我们应该发送请求时包含一个callback queue地址。
```
var corrId = Guid.NewGuid().ToString();
var props = channel.CreateBasicProperties();
props.ReplyTo = replyQueueName;
props.CorrelationId = corrId;
var messageBytes = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "rpc_queue",
basicProperties: props,
body: messageBytes);
// ... then code to read a response message from the callback_queue ...
```