このガイドは、SaaSファウンダー、CTO、エンジニアリングリードを対象としています。すべての変更があらゆるものに影響を与えるため、プロダクトのリリースが遅れているケースを想定しています。有料テナントが稼働中のプロダクトを前提とします。最初のバージョンの構築についてはSaaS MVPアーキテクチャロードマップ、全体像についてはSaaSプラットフォームエンジニアリングガイド、リビルド・リファクタリング・リプラットフォームの一般的な選択についてはデジタルトランスフォーメーションとモダナイゼーションガイドをご覧ください。
このガイドの内容
- モノリスが本当に問題なのか?
- 目標:サービス分割前のモジュラーモノリス
- ルートの選択
- 継ぎ目を見つけ、境界を引く
- ステップバイステップ:モジュール化のパス
- 移行中のテナント、課金、データ
- モダナイゼーションにおけるAI
- 存在する納品実績と存在しないもの
- 代替案:誰が作業をリードするか
- このガイドの限界
- よくある質問
- 次のステップ
モノリスが本当に問題なのか?
モノリスとは、1つのアプリケーションが1つのユニットとしてデプロイされるものです。それ自体は欠陥ではありません。Martin Fowlerの「モノリスファースト」の考え方では、成功したマイクロサービスのほぼすべてが大きくなりすぎたモノリスから始まり、安定したサービス境界はドメインを理解する前には引きにくいと述べています。何かをリファクタリングする前に、次のサインを確認してください:
- 変更が衝突する。 複数のチームが同じファイルを編集し、リリースが互いを待ち、小さな修正でもフルリグレッションが必要になる。
- 1つの障害がすべてを停止させる。 重い帳票やインポート処理がすべてのテナントのサインインと課金を遅らせる。
- 誰も一部を説明できない。 コードが他のコードのデータに手を伸ばしているため、ある部分の変更が別の部分を壊す。
- 1つのワークロードが異なる扱いを必要とする。 検索、メディア処理、AI機能が他の部分と異なるハードウェア、スケーリング、またはリリースルールを必要とする。
別の問題に対してリファクタリングをしないでください。遅いページはインデックス不足、不安定なリリースはテスト不足、高いコストはコスト帰属の不備が原因であることが多く、クラウドコスト管理ガイドで取り上げています。システムが古い、サポートされていない、または全体的に不透明な場合は、まずレガシーシステム評価チェックリストを実行してください。
目標:サービス分割前のモジュラーモノリス
モジュラーモノリスは依然として1つのデプロイ可能なアプリケーションですが、コードは明確なパブリックインターフェースと独自のデータを持つモジュールに分割されています。Shopifyのエンジニアリングチームは、大規模なRailsアプリケーションへのこのアプローチを説明しています:定義された境界を持つコンポーネントにより、開発者は自分たちに関連する部分で作業でき、テストはシステム全体ではなく1つのコンポーネントに対して実行できます。同じ記事では、チームが改めて始めるなら異なる方法を取るだろうという教訓も挙げており、イテレーションを計画することが重要です。
モジュールを単なるフォルダでなく本物にする要素:
- パブリックインターフェース。 他のモジュールは関数を呼び出すかイベントを送信します。内部に直接アクセスすることはありません。
- データの所有権。 各モジュールは自身のテーブルを所有します。他のモジュールは直接読み込んだり結合したりしません。
- オーナー。 1つのチームがモジュールの動作とテストに責任を持ちます。
- 強制されたルール。 モジュールが他のモジュールの内部をインポートするとビルドチェックが失敗します。
SaaSプロダクトの典型的なモジュールは、アイデンティティとアクセス、テナントとエンタイトルメント、課金とサブスクリプション、コアプロダクトドメイン、通知とレポートです。テナントコンテキストはすべてのモジュールを通じて伝わります。その決定が依拠する分離の選択については、マルチテナントアーキテクチャガイドで説明しています。
ルートの選択
| ルート | 強み | リスク | 選ぶべき状況 |
|---|---|---|---|
| モノリスを強化する:テスト、監視、クエリとリリースの修正 | 最もコストの低い変更;症状を取り除くことが多い | 構造が絡み合ったまま | 問題がスピードや安定性であり、結合ではない場合 |
| 現状でモジュラーモノリスへ、1つのモジュールずつ | 1つのデプロイ、1つのデータベースエンジン、モジュール間にネットワークなし | 規律が必要;チェックがないと境界が崩れる | 結合がチームを遅らせているが、スケールは管理可能な場合 |
| Stranglerアプローチで選択したサービスを切り出す | ホットパスや規制対象エリアを分離する | 分散型障害、データ同期、運用負荷の増加 | 証明されたモジュールに独自のスケーリング、リリースペース、または分離が必要な場合 |
| マイクロサービスとして書き直す | すべての部分にクリーンな状態 | 最も長い遅延、古いルールの再学習、機能が凍結 | ほぼない;古いコードをまったく進化させられない場合のみ |
ほとんどのプロダクトは、モジュラーなコアとゼロから数個の切り出されたサービスで終わります。チームはフルなマイクロサービス構成を出発点ではなく、達成すべき目標として扱うべきです。
継ぎ目を見つけ、境界を引く
継ぎ目とは、コードの一部をわずかな変更で残りから分離できる箇所です。アーキテクチャ図からではなく、証拠から見つけます:
- 依存関係マップ。 実際のインポートグラフを生成します。インバウンド呼び出しが多くアウトバウンドが少ないモジュールが最初の候補;絡み合ったコアは最後に来ます。
- データ所有権。 各テーブルについて、どのコードが読み書きするかをリストアップします。多くのエリアから書き込まれるテーブルは、まだ存在しない境界を示します。
- 変更履歴。 一緒に変更されるファイルは通常一緒に属します。独立して変更されるファイルは境界を示唆します。
- ビジネス言語。 課金とサインインにおける「アカウント」のように、異なる場所で異なる意味を持つ名前は、ドメイン間のエッジを示します。
最初のモジュールはリスクが低く学びが多いものを選びます:明確な機能、小さなインターフェース、共有データが少ない。通知やレポートが適していることが多いです。課金とアイデンティティは方法が証明されるまで後回しにし、そこでのエラーはすべてのテナントに影響するため、特別な注意を払って扱います。
ステップバイステップ:モジュール化のパス
-
モノリスを変更しやすい状態にする。
監視、再現可能なリリース、奇妙な動作を含む現在の動作を記録する特性化テストを追加します。
-
モジュールをマッピングして名前をつける。
リスト、各オーナー、意図した依存関係の方向に合意します。
-
ビルドで境界を強制する。
禁止インポートで失敗するルールを追加します。レポートのみモードで開始し、モジュールごとに厳しくします。
-
データを分離する。
所有モジュールのインターフェースを呼び出すことでクロスモジュール結合を除去し、そのインターフェースの背後にテーブルまたはスキーマを移動します。すべてのレコードにテナント識別子を保持します。
-
内部呼び出しをインターフェースとイベントに置き換える。
メールや使用イベントなどの遅い処理やオプションの作業は、モノリス内部の非同期イベントに移動します。
-
テストが満たされたときのみ切り出す。
候補は測定されたニーズを示す必要があります:独自のスケーリングプロファイル、独自のリリースケイデンス、セキュリティまたはコンプライアンス境界、またはエンドツーエンドで所有しなければならないチーム。
-
段階的に移動し、戻る方法を残す。
前にルーティングレイヤーを配置し、いくつかのテナントを新しいコンポーネントに送り、結果を比較します。MicrosoftのStrangler Figパターンはこの段階的な置き換えを説明しており、腐敗防止レイヤーが古いモデルと新しいモデルが互いに漏れないようにします。
各ステップは単独でリリースします。ステップ4でプログラムが止まっても、プロダクトは以前より良くなっています。
移行中のテナント、課金、データ
マルチテナントは、リファクタリングが静かに失敗する場所です。3つのルールが役立ちます:
- テナントコンテキストはオプションではない。 すべてのモジュールとすべての新しいサービスは、手動で繰り返すのではなく、理想的には共有コードでテナント識別子を受け取り強制しなければなりません。
- テナントをコホートで移動する。 内部テナントとフレンドリーテナントから始め、エラーとパフォーマンスを監視し、その後拡大します。10の小テナントで機能する移行が、数年分のデータを持つ1つのテナントには機能しない場合があります。
- 課金とエンタイトルメントを契約として扱う。 使用イベントとプラン制限は、下のコードが変更されている間も顧客に対して同一でなければなりません。切り替える前に、旧パスと新パスから請求書とエンタイトルメント結果を比較します。
データ移動には、移行中の読み書きの計画が必要です:デュアルライト、変更キャプチャ、または短い凍結、それぞれの後に照合チェックが必要です。
モダナイゼーションにおけるAI
AIはエンジニアがすべての決定を保持しながら、モジュール化の読解とドキュメント化の部分を高速化できます。有用な場所は、文書化されていないモジュールの機能の要約、依存関係グラフからの候補境界の提案、レビュー用の特性化テストのドラフトです。生成されたコードとテストは、人が読んでスイートが通過した後にのみマージされます。Netbase JSCは主要な商用およびオープンソースのAIモデルと連携し、プロジェクトごとに選択します。以下の各項目は、Netbase JSCでの成熟度を示しています。
-
納品済み:商品レコメンデーションエンジン。
閲覧と購入履歴から4over4のオンライン印刷ストア向けに構築されました;モダナイゼーションツールではありません。
-
成長中の機能:AIを活用したコードマッピングとテストドラフティング。
エンジニアリングチーム向けの機械学習および生成AI機能;公開されたモダナイゼーション事例にはまだ紐付いていません。
存在する納品実績と存在しないもの
Netbase JSCはマルチテナントSaaSプロダクトを構築・運営しており、このガイドはそのコンテキストで書かれています:
- Cloodo Workspace。 CRM、HRM、クラウドERP、AIモジュールを1つのプロダクトに含む業務管理デジタルワークプレース。Netbase JSCのビジネス部門として構築・運営されています(Cloodoの記録)。
- 米国クライアント向けクラウドERP(非公開)。 Netbase JSCが2020年からオフショア開発および管理パートナーとして開発しているマルチテナントクラウドERP(クラウドERPの記録)。
- Printcart。 Netbase JSCのビジネス部門のWeb to Print SaaS(Printcartの記録)。
- Netztech。 Magento 1からMagento 2 Commerceへ35営業日で移行されたストア(Netztechの記録)。これはプラットフォーム移行であり、モノリス分解ではありません。
Netbase JSCの納品ライフサイクルにはモジュラーかつプロダクト化されたコンポーネントが含まれており、SaaSプロダクトアクセラレーターは再利用可能なモジュールから構築されています。
存在しないもの。 稼働中のSaaSモノリスをモジュールやサービスに分解した内容を説明するNetbase JSCの公開記録は存在せず、そのような作業の期間、デプロイ頻度、コスト、またはパフォーマンス結果を公開したものもありません。上記の方法は引用された情報源と一般的なエンジニアリングプラクティスによるものであり、Netbase JSCの測定された成果によるものではありません。
代替案:誰が作業をリードするか
| ルート | 強み | 選ぶべき状況 |
|---|---|---|
| 自社チーム | 最も深いプロダクト知識 | キャパシティが存在し、誰かがモジュール化を経験したことがある場合 |
| プロダクト後も運営するプロダクトエージェンシー | 素早いスタートと継続性 | 設計、変更、運営を1つのパーティに任せたい場合 |
| アーキテクチャレビュー、その後混合チーム | コミットメント前の継ぎ目と優先度の独立した視点 | チームが手薄で作業の順序が不明確な場合 |
4つの基準が決め手になります:テストと監視の有無、古いコードを理解している人数、移行中も継続しなければならないロードマップ作業の量、そして誰がアーキテクチャを以後所有しなければならないか。Netbase JSCはテナント、課金、セキュリティ、コストのアーキテクチャレビューから始め、スライスを計画します。Netbase JSCのカスタム開発では、クライアントが作成されたIPを所有し、ほとんどのプロジェクトはディスカバリー後に合意された請負契約で進められます。提供サービスはSaaS開発とクラウドプラットフォームエンジニアリングにあります。
このガイドの限界
- すべてのコードベースは異なります;最初の依存関係マップが計画を変えることがよくあります。
- フレームワークと言語によって境界を強制するツールは異なります;お使いのものが何をサポートしているか確認してください。
- 情報源は記録されている内容について引用されています;スピード、コスト、信頼性の数値は主張していません。
Netbase consultantと次のステップを計画する
よくある質問
マイクロサービスに移行すべきですか? 通常、最初のステップとしてはお勧めしません。1つのアプリケーション内でモジュールにリファクタリングし、独自のスケーリング、リリースペース、または分離の測定されたニーズを持つモジュールに対してのみサービスを切り出します。
どのくらいかかりますか? コードのサイズ、テストカバレッジ、データの絡み合い具合によって異なります。Netbase JSCはアーキテクチャレビューと最初の依存関係マップの後に見積もりを出し、典型的な期間は公開していません。
その間も機能のリリースを続けられますか? はい、作業がスライスでリリースされ、ビルドが新しい境界を出現時に強制する場合は可能です。両方のキャパシティを計画してください。
モノリスがレガシーシステムの場合はどうですか? まず評価してください。プラットフォームがサポートされていないか、ルールが不明な場合、リプラットフォーミングまたはディスカバリーがモジュール化の前に来る場合があります。
次のステップ
現在のプロダクトのデプロイ方法、変更を加えるチームの数、最も問題のある部分をお知らせください。継ぎ目をマッピングし最初のモジュールを提案するためのソリューションレビューを予約します。Netbase JSCのインサイトもご覧ください。
関連サービスとソリューション
自社SaaSを運用するチームによるAI対応SaaS開発
Netbase JSCは、ファウンダーおよびプロダクトチーム向けに、マルチテナントのサブスクリプションソフトウェアを立ち上げ・スケールするためのSaaS開発サービスを提供します。自社SaaSプラットフォームであるPrintcartとAI搭載のCloodoワークプレイスを構築・運営しており、その経験をクライアントのプロダクトにも活かしています。典型的なSaaS MVPは、スコープ・インテグレーション・レビュー速度によって異なりますが、8〜12週間が目安です。
詳しく見る
SaaS・コマース向けAI対応クラウドプラットフォームエンジニアリング
Netbase JSCは、SaaSおよびコマースチーム向けに、AWS、Google Cloud、DigitalOcean、Cloudflare上でセキュアかつ再現性の高いクラウドプラットフォームエンジニアリングを提供します。アーキテクチャ設計、コードによる環境構築、マネージドサービスおよびAIサービスの統合を行い、自社でも使用するパターンに基づいて、チームが運用できるプラットフォームを引き渡します。
詳しく見る
SaaSプロダクトアクセラレーター:実績あるNetbase JSCモジュールでAI対応SaaSを立ち上げる
SaaSプロダクトアクセラレーターは、アカウント・請求・ロール・インテグレーション向けの再利用可能なNetbase JSCモジュール群です。創業者やプロダクトチームがサブスクリプションソフトウェアを迅速に立ち上げられるよう支援し、初回リリースからプロダクト内AIにも対応しています。モジュールの再利用により開発期間を最大60%短縮でき、このアプローチはNetbase JSC自身のWeb to PrintサービスであるPrintcartで実証されています。
詳しく見る
プロジェクトを相談する
Netbase JSCは、デジタルプロダクトおよびAI活用ビジネスシステムの設計・開発・モダナイゼーション・運用を支援します。+84 937 869 689
91 Nguyen Chi Thanh, Dong Da, Hanoi, Vietnam
お問い合わせ
構築・モダナイズ・運用したい内容をお聞かせください。