トラフィックシフティングとは?
トラフィックシフティングとは、ルーティングの重みを調整することで、ライブのリクエスト負荷をあるサービスのバージョンから別のバージョンへ段階的に移行する技術です。
トラフィックシフティングは、段階的なロールアウトを具体的なものにする仕組みです。瞬時に切り替えるのではなく、たとえばリクエストの5%を新バージョンに向け、次に25%、そして100%へと向けていきます - 信頼が高まるにつれてダイヤルを調整し、何かおかしいと見えた瞬間に引き戻すのです。
仕組み
router、load balancer、またはservice meshが、設定された重みに従って受信リクエストをバージョン間で振り分けます。新バージョンを10%に設定すると、おおよそ10件に1件のリクエストがそちらへ送られます。重みを変更するとライブトラフィックが再ルーティングされ、何かをdeployし直す必要はないため、シフトは即時かつ可逆的です。
重み付けルーティング
制御のつまみは、各バージョンに割り当てられる重みです。重み付けルーティングを使えば、任意の分割 - 95/5、50/50、0/100 - を表現し、時間をかけてそれらをランプアップできます。この細やかさこそが、二者択一の切り替えを滑らかで制御可能な進行へと変えるのです。
安全なロールアウトを可能にする
トラフィックシフティングは、canary releaseやblue-green切り替えの背後にあるエンジンです。新バージョンを実トラフィックの小さく、しかし増えていく割合に晒すことで、悪いreleaseの影響範囲を限定し、全負荷をかける前に挙動を観察する時間を与えてくれます。
瞬時のロールバック
シフト中も旧バージョンがまだ稼働してトラフィックの大半を処理しているため、ロールバックは新バージョンの重みをゼロに戻すだけの簡単な作業です。旧コードをdeployし直す必要はありません - それは決して消えていないからです - これにより、悪いロールアウトからの復旧はほぼ瞬時に行えます。
sticky sessionと状態
生のリクエスト割合をシフトさせるのは、ユーザーが一貫性を必要とする場合に厄介になりえます - セッションの途中でバージョン間を行き来するのは混乱を招きます。ユーザーまたはセッション単位でルーティングする(特定のユーザーが1つのバージョンに固定される)ことでこれを回避できますが、正確なトラフィック分割に対する制御がやや粗くなるという代償があります。
重要なポイント
- トラフィックシフティングは、ルーティングの重みを調整することでバージョン間の負荷を移行します。
- canaryおよびblue-green戦略を支え、影響範囲を限定します。
- 旧バージョンが常に稼働し続けているため、ロールバックは瞬時に行えます。