掲題のものを実装してみました。
https://github.com/shigenobu/PurpleSofa
もともと、クライアントは1接続前提で作っていたのですが、
TCPのプロキシサーバーを作りたいなーと思い、
ベースライブラリとして、上記ライブラリに複数クライアントを束ねる機能を作ってみました。
PurpleSofaの特徴の1つとして、TCPセッションの最終受信時刻からアイドルタイムを経過すると、
TCPセションを強制的に切断するようにしています。
これはハーフCLOSE対策のためです。
サーバ側は、複数のTCPセッションをまとめて管理していたいのですが、
今回クライアント側も同じ様な対応を施しました。
で、そもそもとしてはTCPプロキシサーバーを作りたいというところなのですが、
長年お世話になっていたHAPROXYが、2系でコンテナで動かすと異常にCPUを消費するということがあり、
公式のISSUEでもあがっているのですが、なかなか完全対応というわけにはいかなそうです。
1系は問題ないので、仕事では1系を使ってますが、、もう古いので。。
意外なほどに、HAPROXYのようなヘルスチェックを兼ねているプロキシサーバーというものは少なく、
K8Sとかの大規模向けだと、どうも取り回しが悪いので、小さいものを作れないかなーと思い立ったわけです。
サンプルを作りつつ、ある程度目処はたったものの、
ヘルスチェックも様々あるので、ヘルスチェック部分をプラグイン化できないかと検討中です。
ちなみに、サンプルのコードは以下のとおりです。
https://github.com/shigenobu/PurpleSofa/blob/master/PurpleSofa.SampleProxy/Program.cs
ちょっとわかりにくいのですが、
上手く溜め込んで、バックエンド・フロントエンドとやり取りする
というのがポイントでしょうか。
要はプロキシはTCP端点をフロントとバックの2つで担当することになるので、
フロントとバックが繋がっていない状態を考慮して、メッセージを溜め込んでおく必要があるということです。
やっている人が少ないのですが、golangでは公式ライブラリとしてあるようなので、
そういった実装も参考にさせていただきました。
.NET8もリリースされたので、そろそろTCPプロキシサーバーを着手していければと考えています。
以上
コメントがあればどうぞ