
システム構成
モノリス
Monolith / モノリシックアーキテクチャ / Monolithic Architecture
全機能を1つのプログラムに集約し、一括で稼働・リリースする作り方です。多くの会社にとって標準の選択肢で、中を業務単位で区切った状態を維持すれば長く使い続けられます。
まいくろさーびす / Microservices / マイクロサービスアーキテクチャ
1つのシステムを機能ごとに独立して開発・リリースできる小さなサービスの集まりとして構築する設計の考え方です。多くの会社ではまだ不要で、まず1つのシステムで構築するほうがよいです。

1つのシステムを受注、在庫、決済といった業務の単位で小さなサービスに分け、それぞれを独立して開発・リリースできるようにする設計の考え方です。サービス同士はネットワーク越しにAPI(Application Programming Interface)による呼び出しや、メッセージによる通知で連携します。対になるのはすべての機能を1つのシステムとしてまとめて構築する形で、モノリスと呼びます。
たとえるなら1つの大きな店舗を、テナントごとに鍵と営業時間を持つショッピングモールに作り替えるようなものです。各テナントは他の店を閉めずに改装できますが、モール全体の管理の手間は増えます。
システムが大規模になり、関わる開発者が増えると、1つのシステムを全員で変更することになります。ある機能の小さな修正でも他チームの変更と一緒にテストし、まとめてリリースしなければなりません。リリース日の調整やテスト待ちが増え、開発者を増やしても開発の速度が向上しなくなります。
マイクロサービスはこの状態を解消する考え方で、業務の単位でシステムを分割し、分割したサービスごとに担当チームを決めます。これにより各チームは他チームの作業の完了とは関係なくリリースできます。
システムの分け方はチームの分け方と対応させる必要があります。チームが1つしかない会社では分ける理由がほとんどありません。
開発チームが2つまでの規模ではサービス間の連携や運用の手間が増えるぶん、むしろ遅くなることが多いです。
アクセス量への対応は1つのシステムのままでもサーバーを増やすことで多くの場合まかなえます。大規模なサービスでも1つのシステムのまま運用を続けている例はあります。EC(Electronic Commerce)プラットフォームのShopifyはマイクロサービスへ移行せず、1つのコードベースの中を業務単位で区切る構成を選択しました。その経緯を2019年に公表した記事で説明しています。
サービスの数が増えるほど連携と運用の負担も増えます。サービスの数はチームの数に合わせて決定するもので、細かさそのものに価値はありません。どのサービスにも責任を持つチームが1つ決まっていることが前提になります。担当の決まらないサービスが出る分け方は、管理しきれないシステムの典型的な形です。
新規開発はまず1つのシステムとして作り、規模が拡大してから分割する進め方が広く推奨されています。最初から分けるべきという反論もあります。事業の初期は業務の区切り自体が変化しやすく、早期に分割すると分け方の引き直しに多くの工数がかかります。新規開発はまず1つのシステムで構築するほうが安全です。
多くの会社ではまだ不要です。確認すべきはチーム数と、リリースのたびに他チームの変更待ちが発生しているかどうかです。人数は補助的な目安にとどめます。
目安として開発チームが2つまでなら1つのシステムの中を機能ごとに区切って作るほうが短期間かつ安価に進むことが多いです。チームが3つ以上に増え、毎回のリリースでチーム間の調整待ちが発生しているなら検討の余地があります。1チームを5〜8人とすると開発者数では20人前後が境目の目安になります。開発を外部に委託している場合は、担当が何チームに分かれているか、1回のリリースで何チームの作業を待つかを開発会社に確認すれば同じ基準で判定できます。
もう1つの前提は運用の仕組みがすでに整っていることです。判定の条件は2つあります。1つはリリースを手作業の手順書に頼らず毎週何度も実施できていることです。もう1つは障害が発生したとき利用者より先に担当者が気づけることです。満たさないうちに分割すると得られる効果より先に運用の負担が増えます。
なぜ分けるのかをチーム体制と変更の頻度で説明できるかを確認します。説明が「将来の拡張性のため」「最新の構成だから」だけなら、過剰な設計の可能性が高いです。
あわせて次の4点を質問すると見極めやすくなります。サービスはいくつに分ける想定で、それぞれをどのチームが担当しますか。各サービスは他のサービスのリリースと関係なく単独でリリースでき、データベースを他のサービスと共有していませんか。リリース後の監視と障害対応を誰がどの体制で行いますか。運用費は1つのシステムで構築する場合と比較して何がいくら増えますか。
サービス数は1チームが担当するのは目安として数個までという点からチーム数に見合っているかを確認します。運用費は監視やログ収集の基盤の月額と、運用担当が何人増えるかの内訳で示してもらいます。内訳を提示できない提案は運用まで見積もっていない可能性があります。
新規事業や立ち上げ期のシステムで数十のサービスに分ける提案なら再検討したほうがよいです。まず1つのシステムの中を業務単位で区切って作る順序なら無理がありません。チームが増えて調整待ちが発生した時点でその区切りに沿って外に切り出します。
一度に全体を作り直すのは推奨しません。既存システムを稼働させたまま、変更が多く他と切り離しやすい機能から1つずつ外に切り出す進め方が安全になります。ストラングラーフィグパターンと呼ばれる進め方で、開発会社との会話でもこの名前で通じます。
既存システムでは業務の区切りがすでに明確なため、新規開発よりは分割の線を引きやすい面があります。それでも全面的な作り直しは目安として数年単位になりやすく、その間は新旧の二重運用になります。1つの機能を切り出すのにかかる期間の目安は数か月です。
切り出すたびに効果を測定し、効果が出なくなった時点で中止すればよいです。数個のサービスを切り出して残りは1つのシステムのまま、という着地も十分に合理的です。
事業の課題や技術的な悩みなどどんなことでもお聞かせください