🐍

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

2017/12/14に公開約4,600字

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 様様ですね。

GitHubで編集を提案

Discussion

ログインするとコメントできます