背景:ビジネスニーズのため、クライアントはbrpcを使用し、サーバーはgrpc c ++バージョン1.23.0を使用します。クライアントが毎回100万のデータを要求すると、クライアントはremote_window_leftが十分なエラーではないと報告します。
ポジショニング方法:両当事者のhellowordの例(brpchelloクライアントがgrpchelloサーバーを要求)を使用してテストします。問題はなく、サーバー側が特別な起動パラメーターを使用している可能性があります。
サーバーコードを表示します。
ServerBuilder builder;
builder.AddListeningPort(server_address_, grpc::InsecureServerCredentials());
builder.SetResourceQuota(quota.SetMaxThreads(128));
builder.AddChannelArgument(GRPC_ARG_HTTP2_BDP_PROBE, 0); // 注释调这一行就没有问题了
builder.AddChannelArgument(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES, 4*1024*1024);
builder.RegisterService((grpc::Service *)this);
server_ = builder.BuildAndStart();
最終的な解決策:comment builder.AddChannelArgument(GRPC_ARG_HTTP2_BDP_PROBE、0);
では、なぜコメントした後に使いやすいのでしょうか。
tlwはトランスポートローカルウィンドウの略語、50051はサーバーのポート番号、
コメントなし:
1)tcpdumpを介してパケットをキャプチャします。
2)サーバー側のフロー制御ログ:
0x7f699c0030d8 [0] [svr] | tupdtが送信されました| trw:65535、tlw:65535、 taw:65535、srw:、slw:、saw:
0x7f699c0030d8 [0] [svr] | t updt recv | trw:65535- > 1048576 、tlw:65535、 taw:65535、srw:、slw:、saw:
データの観点から、ローカルに記録されたウィンドウサイズは、クライアントに通知されたウィンドウサイズと一致していません。
注釈後のシーン:
1)tcpdumpを介してパケットをキャプチャします
2)サーバー側のフロー制御ログ:
0x7fd648003098 [0] [svr] | tupdtが送信されました| trw:65535、tlw:4194304、 taw:65535-> 4194304、srw:、slw:、saw:
0x7fd648003098 [0] [svr] | t updt recv | trw:65535- > 1048576 、tlw:4194304、 taw:4194304、srw:、slw:、saw:
データの観点から、ローカルに記録されたウィンドウサイズは、クライアントに通知されたウィンドウサイズと同じです。
疑問に思う:
ビルダーを介して、brpc c ++のバグかどうかはわかりません。AddChannelArgument(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES、4 * 1024 * 1024)
ローカル変数の値ではなく、設定フレームの値を変更しただけです。
最近github.comに接続できないため、最新バージョンを試すことができません。