LoginSignup
0
0

More than 1 year has passed since last update.

grpc(golang)ぷちメモ

Posted at

背景

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とか使ってライブラリに自分で手を入れるしかないかと。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0