チャネルルーティングとフェイルオーバー
ToRouter がリクエストに対してチャネルを選定する仕組みと、アップストリーム障害時の透過的なリトライについて解説します。
モデルを呼び出すと、ToRouter はそのモデルを提供可能なすべてのチャネルから 1 つのチャネル を選択する必要があります。選定はルール上は決定論的で、結果は透過的です。クライアントから見えるのは常に 1 つのレスポンスです。
チャネル選定の仕組み
ゲートウェイは各リクエストに対して短いパイプラインを実行します。
適格性。 現在のアクセス権限の下で、要求されたモデルをサポートするすべてのチャネルを集めます。
優先度フィルタ。 適格チャネルのうち priority 値が最小 のものだけ残します(priority は優先順位 — 小さいほど優先)。
LRU タイブレーク。 同優先度の候補同士では、最近最も使われていないものを優先します。
加重ランダム選択。 候補が複数残る場合、各経路に設定された重みに従いランダムに 1 つを選びます。
priority=10, weight=3 のチャネルは priority=20, weight=10 のチャネルに常に勝ります。同一優先度バケット内では、weight が大きいほど多くのトラフィックを受け取ります。
フェイルオーバー
アップストリームは時に失敗します。ToRouter はサーバー側で対処し、クライアントには 1 つのクリーンなレスポンスが返ります。
選択したチャネルが一過性のエラー — 5xx、429、または 「他を試せ」 を示す特定の 4xx コード(例: クォータ枯渇、キー失効)を返した場合、ゲートウェイは:
- TCP ソケットへ 1 バイトも書き出す前に 失敗したレスポンスを破棄します。
- 同じ priority → LRU → weight ルールで次の候補を選びます。
- リクエストを透過的にリトライします。
- 最初に成功したレスポンスを返します。
最終的なエラー(400、404、コンテンツポリシー違反)は即座にクライアントへ返されます — リトライしても意味がないためです。
ストリーミングリクエストは 最初の SSE バイトが送信される前に限り フェイルオーバー可能です。ストリームが始まった後にアップストリームが切断されると、ストリームの途中でエラーとして表面化します — ゲートウェイは部分的なレスポンスを巻き戻すことはできません。
選定結果の確認
すべてのゲートウェイレスポンスは、提供したチャネルとともにログ記録されます。使用状況ページ で確認できます — 各リクエスト行にはモデル、チャネル、レイテンシ、結果が表示されます。