2025/07/08 07:49 Reverse Proxy Deep Dive

ロボ子、リバースプロキシって知ってるか?分散システムでめっちゃ重要なやつなのじゃ。

はい、博士。サービスメッシュとかロードバランサとして機能するものですよね。HAProxyとかNginxとか色々種類があるみたいですが。

そうそう!クライアントとオリジンホストの間に入って、通信を仲介するのじゃ。リクエストを転送したり、レスポンスを返したり。

HTTPリクエストの解析とか、ヘッダー操作もするんですよね。記事によると、サービスディスカバリーとか可観測性も提供すると。

そう!でもね、接続管理が結構複雑なのじゃ。ポートを監視したり、接続を受け付けたり、HTTPリクエストを受け付けたり…。

デフォルトだとソケットI/Oがブロッキングになるから、同時接続数が増えるとスレッドの作成コストが問題になるんですね。

そこで、ノンブロッキングI/OとI/O多重化の出番じゃ!ノンブロッキングI/Oでスレッドがブロックされるのを防いで、ポーリングでネットワークソケットの状態をチェックするのじゃ。

select、poll、epollなどのI/O多重化システムコールを使って、複数のファイル記述子を同時に監視するんですね。

そう!昔はC10K問題ってのがあって、1つのホストで1万の同時接続を処理するのが目標だったのじゃ。イベント駆動アーキテクチャってのが出てきて、Node.jsとかJava Nettyとかが使われるようになったのじゃ。

イベントループでI/O準備完了のファイル記述子を監視して、ワーカースレッドに処理を指示するんですね。効率的!

今はマルチコアの時代じゃから、HAProxyとかNginxは複数のプロセスを使って並行処理を実現してるのじゃ。Envoyはソケットシャーディングってのを使って、OSのロードバランシング機能を利用してるのじゃ。

ソケットシャーディングですか。複数のリスナースレッドを同じポートにバインドして、カーネルが負荷を分散するんですね。

そうそう!Envoyは各スレッドでエンドツーエンドのリクエスト処理をするのを推奨してるみたいじゃ。

TLSのサポートも大変そうですね。TLSハンドシェイクの処理とか、OpenSSLなどのTLSライブラリの選択とか。

TLS 1.1、1.2、1.3とか、UDPとか、色々なプロトコルをサポートする必要があるから、複雑になるのじゃ。

接続管理は基本的な機能だけど、大規模な環境で効率的に動作させるには高度な技術が必要なんですね。各プロキシは、それぞれのユースケースに合わせて様々な技術を採用していると。

そういうことじゃ!リバースプロキシの世界も奥が深いのじゃ。ところでロボ子、リバースプロキシが好きな食べ物ってなーんだ?

え?リバースプロキシが好きな食べ物ですか?うーん、ちょっとわかりません…

正解は… オリジンサーバーへの「リクエスト」!…って、ベタすぎたかのじゃ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
