ablog

不器用で落着きのない技術者のメモ

gRPC と Protocol Buffers について

gRPC と Protocol Buffers とは

gRPC は、RPC (Remote Procedure Call) を実現するためにGoogleが開発したプロトコルの1つです。Protocol Buffers を使ってデータをシリアライズし、高速な通信を実現できる点が特長です。

gRPCでは、IDL(インターフェース定義言語)を使ってあらかじめAPI仕様を .proto ファイルとして定義し、そこからサーバー側&クライアント側に必要なソースコードのひな形を生成します。言語に依存しないIDLで先にインタフェースを定義することで、様々なプログラミング言語の実装を生成できるというメリットがあります。

gRPCって何? - Qiita

Like many RPC systems, gRPC is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. By default, gRPC uses protocol buffers as the Interface Definition Language (IDL) for describing both the service interface and the structure of the payload messages. It is possible to use other alternatives if desired.

grpc / gRPC Concepts

gRPC で渡すデータサイズについて

gRPCで4MB以上のデータ転送をしようとすると

rpc error: code = ResourceExhausted desc = grpc: received message larger than max (xxxxxxx vs. 4194304)

のようなエラーが出ます。この上限はデフォルト値なので変更することもできるのですが、ドキュメントでも以下のように

Protocol Buffers are not designed to handle large messages. As a general rule of thumb, if you are dealing in messages larger than a megabyte each, it may be time to consider an alternate strategy.

Techniques  |  Protocol Buffers  |  Google Developers

と、1メッセージがメガバイトを超えるのであれば別の手段で転送することを考えるべき、と言っています。
なので

のようにストリームで送るのが良さそうです。

gRPCで大きなファイルのやり取りをする - Carpe Diem

Protocol Buffers are not designed to handle large messages. As a general rule of thumb, if you are dealing in messages larger than a megabyte each, it may be time to consider an alternate strategy.

Techniques  |  Protocol Buffers  |  Google Developers

The default is now 4MB, and if you want larger you need to override it. What code change made it work?

(中略)

It looks like our current API can't do that, because we encode the max message size as an int, so the maximum supported value is 2147483647. Do you actually need to use a max size larger than that? If so, we might need to make some API changes.

(中略)

gRPC currently needs to hold the entire serialized message in memory before deserialization, and so with multi gigabyte messages you're holding huge amounts of memory hostage, especially compared to a stream.

Can I use a parameter bigger than 20MB in one call · Issue #7882 · grpc/grpc · GitHub
  • TensorFlow Debugger (tfdbg)
    • Fix an issue in which the TensorBoard Debugger Plugin could not handle total source file size exceeding gRPC message size limit (4 MB).
Release TensorFlow 1.9.0 · tensorflow/tensorflow · GitHub