一言でいうと
ストラングラーパターンとは、古いシステムを動かしたまま、機能ごとに、新しいシステムへ少しずつ置き換えていく移行の方法です。
「古いシステムを、一度に全部作り直す」のではなく、新しいシステムを、古いシステムの周りで少しずつ育て、最終的に、古いシステムを不要にします。
たとえ話:営業しながらの店舗改装
人気の店を、全面的に改装するとします。店を閉めて、一気に工事すると、その間の売上が止まり、再開の日に、問題が出るかもしれません。
そこで、営業を続けながら、売り場を1区画ずつ、新しくしていく方法をとります。お客さんは、入口で案内され、改装済みの区画と、これからの区画を、行き来します。工事が進むうちに、古い売り場は、少しずつなくなっていきます。
ストラングラーパターンは、これと同じ考え方です。
仕組み:入口で、振り分ける
この方法の要は、**入口(窓口)**です。利用者や、他のシステムからのリクエストは、まず、この入口に届き、入口が、新旧のどちらに渡すかを決めます。
| 段階 | 状態 |
|---|---|
| 最初 | すべてのリクエストを、古いシステムに渡す |
| 移行の途中 | 一部の機能のリクエストを、新しいシステムに渡す。残りは古いシステム |
| 最後 | すべてのリクエストを、新しいシステムに渡す。古いシステムを停止する |
入口の役割は、リバースプロキシや、API用の窓口で、担うことが多くあります(リバースプロキシとは)。利用者から見た窓口は、変わらないため、裏側で、置き換えが進んでいることに、気づかれません。
進め方の5ステップ
ステップ① 入口を置く
古いシステムの手前に、振り分ける入口を置きます。最初は、すべてを古いシステムに渡すだけで、動作は何も変わりません。ここで、入口を通しても、問題なく動くことを確認します。
ステップ② 切り出しやすい機能を選ぶ
最初に移す機能は、他の機能との結びつきが弱く、影響の小さいものを選びます。いきなり、中心的な機能や、複雑な処理から始めると、失敗した時の影響が大きくなります。
ステップ③ 新しいシステムで、作る
選んだ機能を、新しいシステムで作ります。古いシステムの動きを、正確に把握してから作らないと、細かな挙動の違いが、問題になります。
ステップ④ 振り分けを、切り替える
入口の設定で、その機能のリクエストを、新しいシステムに渡すようにします。いきなり全員ではなく、一部の利用者から段階的に切り替えると、安全です(カナリアリリースとは、ブルーグリーンデプロイとはの考え方が使えます)。問題があれば、入口の設定を戻すだけで、元に戻せます。
ステップ⑤ 古い部分を、削除する
安定して動くことを確認したら、古いシステムの該当部分を、削除します。これを、機能ごとに繰り返します。
良い点
- リスクを、小さくできる:問題の範囲が、限定される
- 元に戻しやすい:入口の設定を戻すだけでよい
- 途中でも、成果が出る:機能ごとに、新しい仕組みの効果が、現れる
- 止めずに、進められる:利用者への影響が、小さい
つまずきやすい点
| 注意点 | 内容 |
|---|---|
| 二重運用のコスト | 移行が終わるまで、新旧の両方を、運用し続ける必要がある |
| データの整合性 | 新旧のシステムが、同じデータを扱う場合、どちらが正とするかを、決める必要がある |
| 入口が、弱点になる | すべてが入口を通るため、入口が止まると、全体が止まる |
| 終わらない移行 | 一部が古いまま残り、移行が完了しない |
| 古い仕様の把握 | 古いシステムの動きを、誰も把握していないと、作り直せない |
特に、移行が完了せず、古い部分が、いつまでも残ることは、よくあります。「どこまで終わったか」を、見える形で管理し、終了の目標を決めることが大切です。
向いている場面と、向かない場面
| 向いている | 向かない |
|---|---|
| システムを止められない(影響が大きい) | 小さく、短期間で作り直せる |
| 古いシステムが大きく、全面的な作り直しが、現実的でない | 新旧を並行して動かす余裕(費用・人手)がない |
| 機能ごとに、切り分けられる | 機能が密接に絡み合い、切り出せない |
| 段階的に、成果を見せたい | 古いシステムの動きを、まったく把握できない |