xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

gRPC / MagicOnion 入門 (11) - 通信可能なデータ量を変更する

gRPC でデータを送受信するにあたり、どこまでのサイズが許容されるのか。今回はそのあたりの制限と、その緩和について見ていきます。

既定の通信データ量の制限

gRPC のフレームワークは 1 度の通信で送受信できるデータ容量に制限を設けています。既定では送信/受信ともに 4MB (= 4194304 bytes) となっています。容量を超えるデータを送信すると、例えば以下のような例外が飛んできます。(= Unity で発生したケース)

例外がスローされました: 'Grpc.Core.RpcException' (Assembly-CSharp.dll の中)
OnAnchor.OnError
Grpc.Core.RpcException: Status(StatusCode=InvalidArgument, Detail="Received message larger than max (10347353 vs. 4194304)")
   at UniRx.Stubs.<>c.<.cctor>b__3_1(Exception ex)
   at UniRx.Operators.DoObservable`1.Do.OnError(Exception error)
 
(Filename: C:/buildslave/unity/build/artifacts/generated/Metro/runtime/DebugBindings.gen.cpp Line: 51)

通信データ量制約の緩和

4MB を超えるデータのやりとりはそう多くはないですが、場合によっては超えるときもあるでしょう。そういうときは ChannelOptions で設定をオーバーライドしてあげましょう。以下のような感じで変更します。

//--- サーバー側
var server = new Server(new []
{
    //--- 送信 / 受信それぞれ個別に設定できます
    new ChannelOption(ChannelOptions.MaxReceiveMessageLength, int.MaxValue),
    new ChannelOption(ChannelOptions.MaxSendMessageLength, int.MaxValue)
});

//--- クライアント側
var channel = new Channel("localhost", 12345, ChannelCredentials.Insecure, new []
{
    //--- こっちも同じ
    new ChannelOption(ChannelOptions.MaxReceiveMessageLength, int.MaxValue),
    new ChannelOption(ChannelOptions.MaxSendMessageLength, int.MaxValue),
});

ポイントとしてはサーバー側もクライアント側も両方設定する必要があるということです。それはそうですよね。サーバー側が 4MB 以上のデータを送信できたとしても、クライアント側で受け付けない設定になっていれば意味がありません。各アプリケーションや通信のシナリオに応じて、適切に設定してあげましょう!