
バックエンドの設計は、その日の仕事がどれだけ戦いになるかを決める。アプリが育つにつれて、最初の選択のひび割れが目に見えてくる。そしていつか、方向を決めないといけない時が来る。モノリスを維持するのか。それとも全部マイクロサービスに分解するのか。
銀の弾丸はない。どちらの手法にも居場所はある。正しい選択は、純粋な技術面よりも、チームの構成と事業の段階に左右されることが多い。この記事では、主要な2つの選択肢と、実際によく機能する現実的な中間案を見ていく。
マイクロサービスの考え方は単純だ。巨大なアプリを1つ作る代わりに、小さく独立したサービスを集めて作る。それぞれが1つのことをうまくこなす。
分散したチームを思い浮かべてほしい。各サービスは自分のデータベースを持ち、準備ができたら他に許可を取らずにいつでもデプロイできる。請求チームがGoを使い、認証チームがRustを好んでも、どちらも譲る必要がない。その自由が人を速くする。少なくとも理論上は。
実際には、これは500人の開発者がいる中で1回のリリースを調整するのが悪夢になるような大組織に向いている。
モノリスは伝統的な手法だ。コードベースも1つ、アプリも1つ、デプロイも1回。ユーザーインターフェースからビジネスロジック、データアクセスまで、すべてが一緒に生きている。
「モノリス」という言葉は、一部の界隈ではほとんど汚い言葉になりつつある。それでも実際の利点はある。単純だ。関数がどこで定義されているかを探すのに地図は要らない。デプロイは1つのスクリプトで済む。小規模から中規模のチームにとって、その単純さは超能力だ。インフラの複雑さに埋もれずに、速く進める。
中小企業でよくあるアンチパターンが、エンジニアの数よりマイクロサービスの数が多くなることだ。100人のエンジニアで300以上のサービスを維持しようとしている組織を見たことがある。結果はカオスだ。
そのラインを越えると、多くのサービスがオーナーを失うか、オーナーが組織再編のせいで文脈を知らないサービスを引き継ぐことになる。また、すべてのリポジトリで依存関係を更新して脆弱性を潰すのに時間を取られる。マイクロサービスをうまくやるには、専任のプラットフォームチームと、ツールへの本格的な投資が必要だ。ほとんどのスタートアップにはそのインフラを用意する余裕がなく、「アジャイル」なはずの設計が保守の悪夢に変わる。
流行だからという理由で設計を選んではいけない。実際に抱えている問題を解決するから選ぶべきだ。トレンドは判断に入れるべきではない。
こんなときはマイクロサービス:
こんなときはモノリス:
ここに秘密がある。マイクロサービスにいきなり飛びつく必要はない。おそらく飛びつくべきではない。
モジュラーモノリスは堅実な中間案だ。デプロイ単位は1つだが、内部ではモジュール間に厳しい境界を設ける。Module AのコードはModule Bのコードを直接インポートできない。定義された公開インターフェースを通す必要がある。マイクロサービスのコード整理の利点を、インフラのオーバーヘッドなしで得られる。
アプリが育つにつれて、独立が必要な部分を切り離していけばいい。
マイクロサービス対モノリスの論争は、だいたい本題を外している。問題はどちらの設計が理論的に優れているかではない。今の自分がどのトレードオフのセットと共存できるかだ。
きちんと構造化されたモノリスから始めよう。痛みが出た時にだけ分割すればいい。未来の自分とDevOpsチームが感謝してくれる。
© Melvin Laplanche - All rights reserved.