メインコンテンツへスキップ

何をお探しですか?

私たちのサービスを探索し、目標達成をどのようにお手伝いできるかをご覧ください

Client Workspace

SaaSモノリスのモジュラーアーキテクチャ移行:先にリファクタリング、分割は必要性が確認されたときだけ

テストとモニタリングで固め、強制された境界と専用データを持つモジュールに分割し、単一のデプロイ可能なアプリケーションとして実行します。モジュールを個別サービスとして切り出すのは、独自のリリースサイクル、スケーリング、または分離が分散システムを正当化するほど必要な場合のみです。

ソリューションレビューを予約する 関連サービスを見る

著者: Netbase Commerce and Platform Engineering Desk · 監修: David (CEO) · 更新日 · 1 分で読める

star

このガイドは、変更のたびにシステム全体に影響が及ぶためにプロダクトのリリースが遅いSaaSファウンダー、CTO、エンジニアリングリードを対象としています。稼働中のプロダクトと有料テナントが存在することを前提としています。最初のバージョンの構築についてはSaaS MVPアーキテクチャロードマップを、全体像についてはSaaSプラットフォームエンジニアリングガイドを、リビルド・リファクタリング・リプラットフォームの一般的な選択についてはデジタルトランスフォーメーションとモダナイゼーションガイドをご参照ください。

このガイドの内容

モノリスは本当に問題なのか?

モノリスとは、一つのアプリケーションを一つのユニットとしてデプロイするものです。これ自体は欠陥ではありません。Martin Fowlerの「モノリスファースト」の考え方では、成功したマイクロサービスのほぼすべてが大きくなりすぎたモノリスから始まっており、ドメインを把握する前に安定したサービス境界を引くことは難しいと述べています。構造を変える前に、次のサインを確認してください。

  • 変更が衝突する。複数のチームが同じファイルを編集し、リリースは互いを待ち、小さな修正にも全体の回帰テストが必要になる。
  • 一つの障害がすべてを止める。重いレポートやインポートが、すべてのテナントのサインインや請求処理を遅延させる。
  • 誰もある部分を説明できない。コードが別のコードのデータに直接アクセスしているため、一箇所の変更が別の箇所を壊す。
  • 特定のワークロードが異なる扱いを必要とする。検索、メディア処理、AI機能が、他の部分とは異なるハードウェア、スケーリング、またはリリースルールを必要とする。

別の問題に対してリファクタリングしないでください。ページが遅い場合はインデックスが不足していることが多く、リリースが不安定な場合はテストが不足していることが多く、コストが高い場合はコスト帰属が不明確なことが多いです。これについてはクラウドコスト管理ガイドで解説しています。システム全体が古くなっている、サポートが切れている、または不透明な場合は、まずレガシーシステム評価チェックリストを実行してください。

目標:サービス化の前にモジュラーモノリスへ

モジュラーモノリスは依然として一つのデプロイ可能なアプリケーションですが、コードは明確なパブリックインターフェースと専用データを持つモジュールに分割されています。Shopifyのエンジニアリングチームは大規模なRailsアプリケーションへのこのアプローチについて説明しています。定義された境界を持つコンポーネントにより、開発者は関連する部分だけで作業でき、テストはシステム全体ではなく一つのコンポーネントに対して実行できます。同記事では、もし最初からやり直すとすれば異なる方法で適用する教訓も列挙されているため、反復を前提に計画してください。

モジュールが単なるフォルダではなく、本物であるための要件:

  1. パブリックインターフェース。他のモジュールは関数を呼び出すかイベントを送信する。内部実装に直接アクセスしない。
  2. データのオーナーシップ。各モジュールは自身のテーブルを所有する。他のモジュールはそれらを直接読み取ったりJOINしたりしない。
  3. オーナー。一つのチームがモジュールの動作とテストに責任を持つ。
  4. 強制されたルール。モジュールが別のモジュールの内部をインポートした場合、ビルドチェックが失敗する。

SaaSプロダクトの典型的なモジュールは、アイデンティティとアクセス、テナントとエンタイトルメント、請求とサブスクリプション、コアプロダクトドメイン、通知、レポートです。テナントコンテキストはすべてのモジュールを通過します。その判断が依拠する分離の選択については、マルチテナントアーキテクチャガイドで説明しています。

移行ルートの選択

ルート 強み リスク 選択する状況
モノリスを強化する:テスト、モニタリング、クエリ、リリース改善 最もコストが低い変更;症状を除去することが多い 構造の絡み合いは残る 問題がスピードや安定性であり、結合度ではない場合
現行のままモジュラーモノリスへ、一モジュールずつ 単一デプロイ、単一データベースエンジン、モジュール間ネットワークなし 規律が必要;チェックなしでは境界が崩れる 結合度がチームを遅くしているが、スケールは管理可能な場合
ストラングラーアプローチで選択したサービスを切り出す ホットパスや規制対象領域を分離できる 分散障害、データ同期、運用の増加 実証済みのモジュールが独自のスケーリング、リリースペース、または分離を必要とする場合
マイクロサービスへの書き直し すべての部分でクリーンな状態から始められる 最長の遅延、以前のルールの再学習、機能開発の停止 ほぼない;古いコードがまったく進化できない場合のみ

ほとんどのプロダクトはモジュラーなコアと、ゼロから数個の切り出されたサービスという構成になります。チームは完全なマイクロサービス構成を、出発点としてではなく、到達すべき目的地として扱うべきです。

境界線(シーム)を見つけてから境界を引く

シームとは、コードの一部を少ない変更で残りから切り離せる箇所です。アーキテクチャ図からではなく、証拠から見つけてください。

  • 依存関係マップ。実際のインポートグラフを生成します。インバウンド呼び出しが多くアウトバウンドが少ないモジュールが最初の候補として適切です;絡み合ったコアは最後に残します。
  • データのオーナーシップ。各テーブルについて、どのコードが読み書きするかをリストアップします。多くの領域が書き込むテーブルは、まだ存在しない境界を示しています。
  • 変更履歴。一緒に変更されるファイルは通常同じモジュールに属します。独立して変更されるファイルは境界を示唆します。
  • ビジネス用語。「アカウント」が請求とサインインで異なる意味を持つなど、場所によって異なる意味を持つ名称はドメイン間の境界を示します。

最初のモジュールはリスクが低く学習効果の高いものを選びます:明確な機能、小さなインターフェース、共有データが少ないもの。通知やレポートが適していることが多いです。請求とアイデンティティは手法が実証されるまで残し、エラーがすべてのテナントに影響するため特別な注意を払って扱ってください。

ステップバイステップ:モジュール化のパス

  1. モノリスを変更しやすくする。

    モニタリング、反復可能なリリース、今日のシステムの動作(奇妙な動作を含む)を記録する特性評価テストを追加します。

  2. モジュールをマッピングして命名する。

    リスト、各オーナー、意図する依存関係の方向について合意します。

  3. ビルドで境界を強制する。

    禁止されたインポートで失敗するルールを追加します。レポートのみモードで開始し、モジュールごとに厳しくしていきます。

  4. データを分離する。

    オーナーモジュールのインターフェースを呼び出すことでクロスモジュールJOINを排除し、テーブルまたはスキーマをそのインターフェースの背後に移動します。すべてのレコードにテナント識別子を保持します。

  5. 内部呼び出しをインターフェースとイベントに置き換える。

    メールや使用イベントなど、低速またはオプションの処理はモノリス内の非同期イベントに移行します。

  6. テストが満たされた場合のみ切り出す。

    候補は測定されたニーズを示す必要があります:独自のスケーリングプロファイル、独自のリリースサイクル、セキュリティまたはコンプライアンス上の境界、またはエンドツーエンドで所有する必要があるチーム。

  7. 段階的に移行し、戻る方法を維持する。

    前面にルーティングレイヤーを置き、少数のテナントを新しいコンポーネントに送り、結果を比較します。Microsoftのストラングラーフィグパターンはこの段階的な置き換えを説明しており、アンチコラプションレイヤーが古いモデルと新しいモデルが互いに漏れ出さないようにします。

各ステップは独立してリリースされます。ステップ4で作業が止まっても、プロダクトは以前より良い状態です。

移行中のテナント、請求、データ

マルチテナンシーは、リファクタリングが静かに失敗する場所です。3つのルールが役立ちます。

  • テナントコンテキストはオプションではない。すべてのモジュールとすべての新しいサービスは、テナント識別子を受け取り強制する必要があります。理想的には手動で繰り返すのではなく、共有コードで実装します。
  • テナントをコホートで移行する。社内の友好的なテナントから始め、エラーとパフォーマンスを監視してから拡大します。10の小さなテナントで機能する移行が、数年分のデータを持つ一つの大規模テナントでは機能しない場合があります。
  • 請求とエンタイトルメントを契約として扱う。コードが変わる間も、顧客向けの使用イベントとプランの制限は同一でなければなりません。切り替える前に、旧パスと新パスの請求書とエンタイトルメントの結果を比較してください。

データ移動には移行中の読み取りと書き込みの計画が必要です:デュアルライト、変更キャプチャ、または短時間のフリーズ。いずれも、その後の調整チェックが必要です。

モダナイゼーションにおけるAI

AIはモジュール化の読み取りと文書化の部分を高速化できますが、すべての判断はエンジニアが行います。有用な場面は、文書化されていないモジュールの機能の要約、依存関係グラフからの候補境界の提案、レビュー用の特性評価テストのドラフト作成です。生成されたコードとテストは、人間が読み確認し、テストスイートが通過した後にのみマージされます。Netbase JSCは主要な商用およびオープンソースのAIモデルと連携しており、プロジェクトごとに選択します。以下の各項目はNetbase JSCにおける成熟度を示しています。

どのような納品実績があり、何がないか?

Netbase JSCはこのガイドが書かれた設定であるマルチテナントSaaSプロダクトを構築・運用しています。

  • Cloodo Workspace。CRM、HRM、クラウドERP、AIモジュールを一つのプロダクトに統合したワークマネジメントのデジタルワークプレイス。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の測定された成果からではありません。

代替案:誰が作業をリードするか

ルート 強み 選択する状況
自社チーム プロダクトへの深い知識 リソースがあり、モジュール化を経験した人がいる場合
プロダクト開発後も運用するプロダクトエージェンシー 迅速なスタートと継続性 設計、変更、運用を一つのパーティーに任せたい場合
アーキテクチャレビュー後に混成チーム コミットメント前にシームと優先順位の独立した視点 チームが逼迫しており、作業順序が不明確な場合

4つの基準が判断を左右します:テストとモニタリングが存在するか、旧コードを理解している人が何人いるか、移行中にどれだけのロードマップ作業を継続しなければならないか、そして誰が移行後にアーキテクチャを所有しなければならないか。Netbase JSCはテナンシー、請求、セキュリティ、コストのアーキテクチャレビューから始め、スライスを計画します。Netbase JSCのカスタム開発では、クライアントがそのために作成されたIPを所有し、ほとんどのプロジェクトはディスカバリー後に合意された請負契約で実行されます。提供内容はSaaS開発とクラウドプラットフォームエンジニアリングにあります。スコープ付きエージェンシーと専任チームの広義の選択については、専任SaaSチームとプロダクト開発エージェンシーを参照してください。

このガイドの限界は何ですか?

  • コードベースはそれぞれ異なります。最初の依存関係マップが計画を変えることが多いです。
  • フレームワークと言語によって境界を強制するためのツールが異なります。ご使用のものが何をサポートしているか確認してください。
  • ソースはドキュメント化している内容について引用されています。速度、コスト、信頼性の数値は主張していません。

Netbaseのコンサルタントと次のステップを計画する

よくある質問

通常、最初のステップとしてはお勧めしません。まず一つのアプリケーション内でモジュールに再構成し、独立したスケーリング、リリースペース、または分離の測定されたニーズを持つモジュールに対してのみサービスを切り出してください。

コードのサイズ、テストカバレッジ、データの絡み合いの度合いによって異なります。Netbase JSCはアーキテクチャレビューと最初の依存関係マップの後に見積もりを行い、典型的な期間は公開していません。

はい、作業がスライスでリリースされ、ビルドが新しい境界を出現時に強制する場合は可能です。両方のためのキャパシティを計画してください。

まず評価してください。プラットフォームがサポートされていないかルールが不明な場合、モジュール化の前にリプラットフォームまたはディスカバリーが必要になる場合があります。

次のステップ

現在のプロダクトのデプロイ方法、変更を加えるチームの数、最も問題のある部分をお知らせいただければ、シームをマッピングして最初のモジュールを提案するソリューションレビューを予約します。Netbase JSCのインサイトもあわせてご覧ください。

自社SaaSを運営するチームによるAI対応SaaS開発 自社SaaSを運営するチームによるAI対応SaaS開発

Netbase JSCは、創業者やプロダクトチームがマルチテナントのサブスクリプションソフトウェアをAI機能付きで立ち上げ・拡大するためのSaaS開発を提供しています。自社SaaSプラットフォームであるPrintcartとAI搭載のCloodoを構築・運営した経験をクライアントのプロダクトに活かします。標準的なSaaS MVPはスコープによって異なりますが、通常8〜12週間で完成します。

詳しく見る
line
AIに対応したSaaS・コマース向けクラウドプラットフォームエンジニアリング AIに対応したSaaS・コマース向けクラウドプラットフォームエンジニアリング

Netbase JSCは、SaaS・コマースチームのために、AWS、Google Cloud、DigitalOcean、Cloudflare上でセキュアかつ再現性の高いクラウドプラットフォームエンジニアリングを提供します。アーキテクチャの設計からインフラのコード化、マネージドサービス・AIサービスの接続まで対応し、お客様のチームが自律的に運用できるプラットフォームを、私たち自身が運用する方法でお届けします。

詳しく見る
line
SaaSプロダクトアクセラレーター:実績あるNetbase JSCモジュールでAI対応SaaSを立ち上げる SaaSプロダクトアクセラレーター:実績あるNetbase JSCモジュールでAI対応SaaSを立ち上げる

SaaSプロダクトアクセラレーターは、アカウント・請求・ロール・インテグレーション向けの再利用可能なNetbase JSCモジュール群です。創業者やプロダクトチームがサブスクリプションソフトウェアを迅速に立ち上げられるよう支援し、初回リリースからプロダクト内AIにも対応しています。モジュールの再利用により開発期間を最大60%短縮でき、このアプローチはNetbase JSC自身のWeb to PrintサービスであるPrintcartで実証されています。

詳しく見る
line

Netbaseにリモートで依頼する

Netbaseのすべての案件はリモートで納品されるため、どの国・業界のクライアントとも協業できます。これまで80か国のクライアントと実績があります。契約・請求書はNetbase JSCが発行し、支払いはNetbase JSCの銀行口座への振込またはPayPal Businessで行います。CEO・Huy Nguyen(David)にWhatsAppまたはメールでご連絡ください。

Netbaseに問い合わせる

プロジェクトを相談する

Netbase JSCは、デジタルプロダクトおよびAI活用ビジネスシステムの設計・構築・モダナイゼーション・運用を支援します。
プロジェクトのお問い合わせ

project@netbasejsc.com

WhatsApp

+84 937 869 689

オフィス所在地

91 Nguyen Chi Thanh, Dong Da, Hanoi, Vietnam

ご連絡ください

構築・モダナイゼーション・運用したい内容をお聞かせください。

構築・モダナイゼーション・運用したい内容をお聞かせください。

Netbaseに問い合わせる