Python
RPC
gRPC
iRidgeDay 15

【Python】RPCライブラリ・フレームワークまとめ

はじめに

 iRidge Advent Calendar 2017の15日目の記事です。

 業務でMprpcを使う機会がありました。Mprpcとは、MessagePackプロトコルを用いたRPCライブラリです。

 RPCフレームワークとしてまず挙げられるのは gRPC であるかと思いますが、そもそもなぜgRPCが注目されているのか、他にライブラリやフレームワークがあるのかといったことが気になったのでこの機会にまとめます。

REST vs RPC

 RPCはRESTと同じくWeb APIを実現するための手法です。各サービス間の連携方法として広く採用されているのはRESTですが、RESTは一定の原則こそあるものの、複雑で自由度が高くベストプラクティス的なものがほぼ存在しません。

 一方、RPCは仕様がすでに決まっていることが多く、開発者は考慮するべき点が絞られるため本来集中すべき開発に時間を割くことができます。

 例えば、RPCのフレームワークであるgRPCは、 .proto という拡張子ファイルにインターフェース定義を作成することで、これに準拠するサーバ・クライアントのソースコードのひな型が自動生成されます。.proto は言語に依存しないIDLであるため、インターフェース定義のドキュメントとしての効果もあるといえます。

 以下のスライドが詳しいです。

 マイクロサービスバックエンドAPIのためのRESTとgRPC

PythonのRPCライブラリ・フレームワークまとめ

RPC プロトコル QuickStart
xmlrpc XML-RPC
json-rpc JSON-RPC http://json-rpc.readthedocs.io/en/latest/quickstart.html
Mprpc MessagePack http://mprpc.readthedocs.io/en/latest/intro.html 
gRPC Protocol Buffers https://grpc.io/docs/quickstart/python.html

 Pythonで実装できるRPCは調べてみたところ、4種類ありました。それぞれ採用しているプロトコルが大きな違いで、これによってデータ形式が異なります。それぞれ公式のQuickStartを試してみることで違いがわかるかと思います。それぞれの特徴をまとめてみます。

xmlrpc

XML-RPC は HTTP 経由の XML を使って遠隔手続き呼び出し (Remote Procedure Call) を実現する方法です。XML-RPC を使うと、クライアントはリモートサーバー (サーバーは URI で名前付けられます) 上のメソッドを引数付きで呼び出して、構造化されたデータを受け取る事ができます。

 Python3の標準ライブラリ(Python2ではxmlrpclib)で、プロトコルはXML-RPC
データ形式はXMLです。

json-rpc

 This implementation does not have any transport functionality realization, only protocol. Any client or server implementation is easy based on current code, but requires transport libraries, such as requests, gevent or zmq, see examples.

・Vanilla Python, no dependencies.
・200+ tests for multiple edge cases.
・Optional backend support for Django, Flask.
・json-rpc 1.1 and 2.0 support.

 プロトコルはJSON-RPCで、データ形式はJSONです。

Mprpc

mprpc is a lightweight MessagePack RPC library. It enables you to easily build a distributed server-side system by writing a small amount of code. It is built on top of gevent and MessagePack.

 プロトコルはMessagePack

 MessagePackとは、

It's like JSON. but fast and small.

と謳っており、バイナリ形式のシリアライズ方式のため、JSONに比べ高速かつデータが小さいのが特徴です。

参考記事: MessagePackをPythonで使ってみる

gRPC

gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

 Googleが開発したOSSのRPCフレームワークで、プロトコルはProtocol Buffers

 Protocol Buffersとは

think XML, but smaller, faster, and simpler.

らしく、下記のようなデータ構造になります。バイナリ形式のシリアライズ方式のため、XMLより高速かつデータが小さいのが特徴です。

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}

参考記事: ProtocolBuffersについて調べてみた

所感

 全てのQuickStartを試してみましたが、gRPCがもっともドキュメントが豊富で初心者にはありがたかったです。QuickStartが簡潔で学習コストが一番低かったのはMprpcだったので、PythonでRPCをサクッと実装してみたい時はオススメかもしれません。

さいごに

 データ形式によって様々なプロトコルが存在し、それごとにRPCのライブラリやフレームワークがあることがわかりました。これだけ種類があると使い分けはどうするという話になるかと思いますが、 ドキュメントが充実していて参考文献も豊富な gRPC を使っておけば問題ないと思います。また、Docker, Netflix、メルカリなどで採用実績があり、採用する理由としては十分そうです。Google様様ですね。