gRPCの接続エラー、4740180って何?

gRPCのJavaクライアントで以下のようなエラーメッセージが出てきたら、おそらく接続先の間違い。普通のHTTPサーバに接続しようとしていると思われる

io.grpc.StatusRuntimeException: INTERNAL: error in frame handler

Caused by: java.io.IOException: FRAME_SIZE_ERROR: 4740180

gRPCはフレームと呼ばれるバイナリの塊としてデータが送信される(これはgRPCというよりgRPCがトランスポートに使用しているHTTP/2の仕様)。このフレームの先頭24ビットがフレーム長を示している。

HTTPレスポンスの先頭は HTTP/1.1 404 Not Found のようなステータスメッセージである。この先頭24ビット(3バイト)の HTT を数値に変換すると・・・

> parseInt(Buffer.from('HTT').toString('hex'), 16);
4740180

というわけで FRAME_SIZE_ERROR: 4740180 に一致。そしてこの数値がデフォルトで設定されているフレームサイズ上限値よりも大きいためエラーになったものだろうと推測される。よって4MB以上のフレームを受け取れるようにしておくと異なるエラーメッセージになると思われる。

github.com