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

何をお探しですか?

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

SaaSモノリスからモジュラーアーキテクチャへ:まず再構成し、テストが必要性を示したときだけ分割する

テストと監視を整備してモノリスを固め、強制された境界と専用データを持つモジュールに分割し、1つのデプロイ可能なアプリケーションとして稼働させることでSaaSモノリスを近代化します。独自のリリースペース、スケーリング、または分離が必要なほど切実な場合にのみ、モジュールを別サービスとして切り出します。

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

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

star

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

このガイドの内容

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

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

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

別の問題に対して再構成しないでください。ページが遅いのはインデックスが不足していることが多く、不安定なリリースはテストが不足していることが多く、費用が高いのはコスト配分が不足していることが多く、これについてはクラウドコストコントロールガイドで扱っています。システムが古い、サポートされていない、または全体として不透明な場合は、まずレガシーシステム評価チェックリストを実行してください。

目標:サービス分割前のモジュラーモノリス

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

モジュールを単なるフォルダではなく本物にするもの:

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

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

ルートの選択

ルート 強み リスク 選ぶべき状況
モノリスを強化する:テスト、監視、クエリ、リリース修正 最も安価な変更。多くの場合、症状を取り除く 構造は絡まったままになる 問題がスピードや安定性であり、結合ではない場合
既存のままモジュラーモノリスへ、1モジュールずつ 1つのデプロイ、1つのデータベースエンジン、モジュール間にネットワークなし 規律が必要。チェックなしでは境界が侵食される 結合がチームを遅くしているが、スケールは管理可能な場合
ストラングラーアプローチで選択したサービスを切り出す ホットパスまたは規制対象エリアを分離する 分散障害、データ同期、運用増加 実績のあるモジュールが独自のスケーリング、リリースペース、または分離を必要とする場合
マイクロサービスとして書き直す すべての部分でクリーンスレート 最長の遅延、古いルールの再学習、機能が凍結される ほぼない。古いコードをまったく進化させられない場合のみ

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

つなぎ目を見つけ、境界を引く

つなぎ目とは、コードの一部を変更を最小限にして他の部分から切り離せる箇所です。アーキテクチャ図からではなく、証拠から見つけてください。

  • 依存関係マップ。 実際のインポートグラフを生成します。インバウンドが多くアウトバウンドが少ないモジュールが最初の候補として適しています。絡み合ったコアは最後にします。
  • データ所有権。 各テーブルについて、どのコードが読み書きするかをリストアップします。多くの箇所から書き込まれるテーブルは、まだ存在しない境界を示しています。
  • 変更履歴。 一緒に変更されるファイルは通常一緒に属しています。独立して変更されるファイルは境界を示唆しています。
  • ビジネス言語。 異なる場所で異なる意味を持つ名前(例:請求における「account」とサインインにおける「account」)はドメイン間の境界を示しています。

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

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

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

    監視、繰り返し可能なリリース、そして奇妙な動作を含む現在のシステムの動作を記録する特性テストを追加します。

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

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

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

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

  4. データを分離する。

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

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

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

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

    候補は計測された必要性を示さなければなりません。独自のスケーリングプロファイル、独自のリリースサイクル、セキュリティまたはコンプライアンス境界、またはエンドツーエンドで所有しなければならないチームです。

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

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

各ステップは単独でリリースされます。ステップ4でプログラムが停止しても、プロダクトは以前より改善されています。

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

マルチテナンシーは、再構成が静かに失敗する箇所です。3つのルールが助けになります。

  • テナントコンテキストは省略できません。 すべてのモジュールとすべての新サービスは、テナント識別子を受け取り強制しなければなりません。理想的には手作業で繰り返すのではなく共有コードで行います。
  • テナントをコホートで移行する。 内部テナントやフレンドリーなテナントから始め、エラーとパフォーマンスを監視してから広げます。10の小さなテナントで機能する移行が、数年分のデータを持つ1つのテナントには機能しない場合があります。
  • 請求とエンタイトルメントを契約として扱う。 コードが変わっても、使用イベントとプラン制限は顧客に対して同一でなければなりません。切り替え前に古いパスと新しいパスの請求書とエンタイトルメント結果を比較します。

データ移行には、移行中の読み取りと書き込みの計画が必要です。デュアルライト、変更キャプチャ、または短い停止のいずれかで、それぞれ後に照合チェックが伴います。

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

AIはモジュール化の読み取りとドキュメント化の部分を加速できますが、エンジニアがすべての決定を保持します。有用な箇所は、ドキュメント化されていないモジュールの動作の要約、依存関係グラフからの候補境界の提案、レビュー用の特性テストの草稿作成です。生成されたコードとテストは、人がレビューしてスイートが通過した後にのみマージされます。Netbase JSCは主要な商用およびオープンソースのAIモデルと連携しており、プロジェクトごとに選択されます。以下の各項目は、Netbase JSCでの成熟度を示しています。

存在する納品実績と存在しないもの

Netbase JSCはマルチテナントSaaSプロダクトを構築・運営しており、これがこのガイドが書かれた背景です。

  • Cloodo Workspace。 CRM、HRM、クラウドERP、AIモジュールを1つのプロダクトに統合したワークマネジメントデジタルワークプレイスで、Netbase Business Divisionとして構築・運営されています(Cloodoの実績)。
  • 米国クライアント向けクラウドERP(非公開)。 Netbase JSCが2020年からオフショア開発および管理パートナーとして開発してきたマルチテナントクラウドERP(クラウドERPの実績)。
  • Printcart。 Netbase Business DivisionsのWeb to Print SaaS(Printcartの実績)。
  • Netztech。 Magento 1からMagento 2 Commerceへ35営業日で移行されたストア(Netztechの実績)。これはプラットフォーム移行であり、モノリス分解ではありません。

Netbase JSCの納品ライフサイクルにはモジュラーおよびプロダクタイズされたコンポーネントが含まれており、SaaSプロダクトアクセラレーターは再利用可能なモジュールから構築されています。

存在しないもの。 公開されたNetbase JSCの実績の中に、稼働中のSaaSモノリスをモジュールやサービスに分解したものはなく、そのような作業の期間、デプロイ頻度、コスト、パフォーマンス結果を公開しているものもありません。上記の手法は引用されたソースと一般的なエンジニアリング実践から来ており、Netbase JSCの計測された成果によるものではありません。

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

ルート 強み 選ぶべき状況
自社チーム 最も深いプロダクト知識 キャパシティがあり、誰かがモジュール化を経験している場合
プロダクトをその後も運営するプロダクトエージェンシー 迅速なスタートと継続性 設計、変更、運用を1つのパーティに任せたい場合
アーキテクチャレビューの後に混合チーム コミットメント前のつなぎ目と優先度の独立した視点 チームが手一杯で作業の順序が不明確な場合

4つの基準が決定します。テストと監視が存在するか、古いコードを理解している人数、移行中に続けなければならないロードマップ作業の量、そして誰がその後アーキテクチャを所有しなければならないかです。Netbase JSCはテナンシー、請求、セキュリティ、コストのアーキテクチャレビューから始め、スライスを計画します。Netbase JSCのカスタム開発では、クライアントがそのために作成されたIPを所有し、ほとんどのプロジェクトはディスカバリー後に合意された請負契約で進められます。このオファーはSaaS開発とクラウドプラットフォームエンジニアリングにあります。

このガイドの限界

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

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

よくある質問

通常、最初のステップとしてはお勧めしません。1つのアプリケーション内でモジュールに再構成し、個別のスケーリング、リリースペース、または分離に対して計測された必要性があるモジュールに対してのみサービスを切り出してください。

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

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

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

次のステップ

現在のプロダクトのデプロイ方法、何チームが変更しているか、どの部分が最も問題かをお聞かせください。ソリューションレビューを予約して、つなぎ目をマッピングし最初のモジュールを提案します。また、Netbase JSCのインサイトをもっと読むこともできます。

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

Netbase JSCは、創業者やプロダクトチームがAI機能を備えたマルチテナントのサブスクリプションソフトウェアをローンチ・スケールするためのSaaS開発サービスを提供しています。自社SaaSプラットフォームであるPrintcartおよびAI搭載のCloodoワークプレイスを構築・運用しており、その経験をクライアントのプロダクトに活かしています。標準的なSaaS MVPは、スコープ・インテグレーション・レビュー速度によって異なりますが、8〜12週間が目安です。

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

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 JSCのすべての案件はリモートで納品されるため、世界中のどの国・業界のクライアントとも協業できます。これまで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に問い合わせる