なぜgRPC??
gRPCの理解のため実際にツールを作ってみよう!ということで、gRPCを利用してファイル転送ツールを作ってみました。
言語はpythonです。
質問やアドバイスなどがあれば、コメントを頂けると幸いです。
なぜgRPCに興味を持ったかというと、Distributed Tensorflowでサーバー間通信に使われていて、
理解のためにとりあえず作ってみよーという感じです。
詳細はgRPCの公式を参照するといいです。
簡単に言うと、gRPCはHTTP2を利用して、様々なプラットフォーム間でリモートで関数を呼び出し、その出力を得ることができます。
また、インターフェースの言語に縛られないのも大きな特徴になっています。
構成としてはclientとserverに分かれていて、clientがRequestを送って、serverがResponseを返して通信を実現しています。
以下の図参照。
gRPCのいいところは、
- 対応インターフェースが多いところ(C++, python, golang, ruby, Java..)
- clientとserver側で違うインターフェースでもOK
- .protoでserveの定義を書けば各インターフェース向けのひな型を自動生成してくれる。
- それをimportすれば基本的な実装を使える!!
pyuploader
作ったツールはここに上げました。
送信したいマシンのipアドレスを指定することでclientからserver側にファイル転送をすることができます。
linux-Windows間,Windows-Windows間のファイル転送などに使えるかなと思います。
自分はWindowsからlinuxにアクセスして作業してるのですが、linuxからWindowsにファイルを持ってくるのって結構めんどくさいのでこのツール使っています。
Windows起動時にpython uploader.py -s
でserverを常時起動しておいて、いつでもlinuxからファイル転送できるようにしています。
ファイル送る時はこんな感じです。(とりあえず送ったファイル全部表示させてます。)
実装
Python Quickstartを参考にして作りました。
他の言語のガイドも載っています。
Python Quickstartを見るとわかると思いますが、protoをから以下のようにするとひな型を自動生成してくれます
$ python -m grpc_tools.protoc --python_out=. --grpc_python_out=. helloworld.proto
自分が作ったツールのupload_pb2.py,upload_pb2_grpc.pyは自動生成されたファイルです。
gRPCの1Requestで送れる通信容量には制限があるので、大きなファイルを転送するのには向きません。
なので今回は、下記のようにStreaming方式でファイル転送を行っています(ファイルを分割して複数回に分けて通信しています。)
syntax = 'proto3';
service Upload {
rpc Fileup(stream Tdata) returns (stream Tdata) {}
}
message Tdata {
string data = 1;
int64 size = 2;
string name = 3;
}