理系学生日記

おまえはいつまで学生気分なのか

「モノリスからマイクロサービスへ」の1章、2章を読んだ

ぼくはSIerに勤めていますが、SIにおいても多数のマイクロサービスアーキテクチャ(MSA)の採用あるいは移行というプロジェクトが存在します。 そういう状況ではあるのですが、自分の中にはMSAの採用・移行をどのように行うべきかという方法論がイマイチ存在しませんでした。

それなりにMSAの話をいただく中で何か寄って立つものも必要かと思い、「モノリスからマイクロサービスへ」を読み始めました。

書籍は6章から構成されますが、2章までがMSAへ移行する上でのメンタルモデル的な内容、3章からが具体的な移行パターンのようです。

1章 必要十分なマイクロサービス
2章 移行を計画する
3章 モノリスを分割する
4章 データベースを分割する
5章 成長の痛み
6章 終わりに

ようやく2章まで読めたので、自分の整理のために、ここまでの内容を振り返ります。 マインドマップはこんなかんじ。

マイクロサービスとは何か

まず冒頭に出てくるのがマイクロサービスの定義です。この書籍においては、以下のように定義されています。

マイクロサービスとは、ビジネスドメインに基づいてモデル化された、独立してデプロイ可能なサービスだ。

そして、マイクロサービスにおいて極めて重要なのは「独立デプロイ可能性」である旨が続きます。 独立デプロイ可能性は「あるマイクロサービスに対する変更を、他のサービスに影響を与えることなく本番環境へデプロイできるという考え方」とされています。

マイクロサービスアーキテクチャを取る利点としては、複数のサービスを独立して並行開発できアジリティが向上する旨をよく言われます。

マイクロサービスへの移行の前に

「マイクロサービスを手にすることが勝利ではない」。これは2章の冒頭に記載がある言葉です。 マイクロサービス化する目的は何かをきちんと定め共有するところが一丁目一番地です。

MSAへの移行にはそれを行うための人員や費用という意味でも、そして「フィーチャーの追加よりも移行作業を優先する」意味でも多額の投資が必要になります。 これを正当化するだけの目的がMSA化になくてはなりませんし、それはMSA化以外の方法では達成できない(あるいは費用対効果が高い)ことでなくてはなりません。そういう意味で、MSA化の必要性を見極めるための3つの質問は非常に示唆に富むものでした。

  1. 達成したいことは何か
  2. マイクロサービスの他に代替案はなかったか
  3. どうすれば移行がうまくいっているか分かるだろうか

また、MSA化は多額のコストがかかるので、達成したいことは複数になります。 チームの自律性やスケーリング、各サービスが独立デプロイ可能性を持つことによるアジリティの向上など。 一方で、組織にとって何が重要で何はそれほどでもないかというトレードオフを定義しておかないと、本来は「目的」でないマイクロサービス化が目的化されてしまいます。単に目的を羅列するのではなく、真の目的は何で副次的に狙う効果がどれなのかを定義しろというのは、どこでも言えることですね。

段階的に移行する

ビッグバンリライトをしても、保証されるのはビッグバンだけだ。

「2.7段階的に移行して行くことの重要性」では、Martin Fowlerの言葉が引用されています。 そこで言われているのは以下の2点でしょうか。

  • 人間は失敗をする生き物なので、間違いの影響を最小限に留め学びながら進めるためにも、一気にMSA化を進めるのではなく段階的なアプローチを取ること
  • 本番環境で積極的に利用されるまでは重要な教訓は学べないこと

MSA化は複雑さをもたらし、その複雑さは開発ではなく運用の方に大きな影響を与えます。開発チームのエゴに陥らないためにも、少しずつ本番環境を対象にマイクロサービスへ分割して行くべきということでしょう。

どうマイクロサービスへ分割するか

まずはドメインモデルを定義し、DDDのいう「境界づけられたコンテキスト」へと分割する。その「境界づけられたコンテキスト」が個々のサービスへの候補になるというのはいろんなところで言われていますが、この本はもう少し実践的でした。

  1. イベントストーミングを行い、ステークホルダーとともに共有ドメインモデルを定義する
    • ビジネスで発生するドメインイベントを定義し、「集約」へとまとめ、さらに集約を「境界づけられたコンテキスト」へまとめる
  2. コンテキストの間の依存関係を分析し、依存の小さいところを探す

前提にあるのは、「段階的移行」においてはまず短期的成果を実現しなければ、最終的なビジョンに対する組織・メンバーの信頼を失ってしまうことです。 このため、どこからマイクロサービス化を進めるのかを考える上での1つの基準は「マイクロサービスへ分解しやすいところから」です。

一方で、マイクロサービス化の目的に照らした効果を得ることも重要です。このため、「分解しやすさ」と「分解による利益」の2軸の双方で適切なところからマイクロサービス化せよ、というのが指針のようでした。