背景
1秒間で複数のクライアントから10回以上パケットを送られ、それを全クライアントに打ち返すというような状態を想定した時、ちゃんとパフォーマンスが出るか気になり簡単な検証コードを書いて試したところ、一定時間経過後エラーが発生せず処理が止まってしまう現象に見舞われた
検証コード
https://github.com/syanhaiD/envoy-grpc-prac/blob/verify_grpc/cmd/verify/server/main.go
https://github.com/syanhaiD/envoy-grpc-prac/blob/verify_grpc/cmd/verify/client/main.go
原因
internal/transport
下のコードを追っていくとざっくりつかめるが、
どうにもrecvされてないパケットはstreamにたまっていき、それの許容サイズはdefaultWriteQuota
までであり、
達してしまうとrecvされるなり無理矢理flushするなりで解放しない限り処理がブロックされる
つまり
クライアント側でrecvせずにひたすらsendするって状態は普通無いと思うので、なんらかの珍しい事故あるいは自分がこの事象を踏んだ時のように簡易に検証しようとしたとかで無ければそうそう起きない話と思われる。
もしやんごとなき理由で何か細工せざるを得ない場合は外部からどうにかする方法は恐らく無いのでgo.modのreplaceとか使ってライブラリに自分で手を入れるしかないかと。