概要
gRPCでは1つのHTTP/2コネクション上でstreamを多重化します。
しかしidleなコネクションは、LBなど間に介在するネットワーク機器によって気づいたら切断されているケースがあります。
そうならないよう、定期的にパケット(PINGフレーム)を流して「idleではないよ」とコネクションを維持しようとするのがいわゆるkeepaliveという仕組みです。
gRPCではデフォルトの設定では無効になっている&地味に設定が細かいので1つ1つ説明します。
gRPCのkeepaliveの役割
大きく2つあります。
1つ目は先に述べたようにidleコネクションを維持するためです。
2つ目は死んだコネクション(TCPハーフオープン)があったら切断し、再接続するためです。
例えばNLBでは350秒以上idleなコネクションが切断される仕組みがあり、これによって普段あんまりトラフィックの無いサービスでいつの間にか切断されており、次回のリクエストでもその死んだコネクションをそのまま使おうとしてエラーになるケースをちらほら見かけます。
1つ目の対応でコネクションを維持するのも解決策の1つですが、切断された古いコネクションを使い続けないよう、再接続するというのも1つです。
環境
- Go v1.15.0
- grpc-go v1.29.1