##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 ...
```