Pythonで高速なRPCを実装するためのライブラリであるMprpcを紹介します。
内部では、MessagePack RPCプロトコルを用いていて、Java、C++、PHP、Rubyなど既存の他言語のクライアントとも通信が可能になっています。
下記のように簡単にRPCサーバを記述することが出来ます。
sum_server.py
from gevent.server import StreamServer
from mprpc import RPCServer
class SumServer(RPCServer):
def sum(self, x, y):
return x + y
server = StreamServer(('127.0.0.1', 6000), SumServer())
server.serve_forever()
RPCServerクラスを継承してメソッドを定義すると、定義されたメソッドが自動的にRPCの関数として登録されます。
sum_client.py
from mprpc import RPCClient
client = RPCClient('127.0.0.1', 6000)
print client.call('sum', 1, 2)
このような感じでクライアントを記述できます。
$ python sum_server.py &
[1] 30945
$ python sum_client.py
3
最後に、既存の公式MessagePack RPC実装(Tornadoベース)及びdotCloudのZeroRPCとパフォーマンスを比較してみます。使用しているコードはこちらにあります。
% python benchmarks/benchmark.py
call: 9508 qps
call_using_connection_pool: 10172 qps
% pip install msgpack-rpc-python
% python benchmarks/benchmark_msgpackrpc_official.py
call: 4976 qps
% pip install zerorpc
% python benchmarks/benchmark_zerorpc.py
call: 655 qps
既存のMessagePack RPCクライアントの約2倍、ZeroRPCの約14倍高速に動作していることが分かります。