Chuyển đến nội dung chính

レッスン 4: サービスの分解 — 境界のあるコンテキストとサービスの境界

境界コンテキストに基づくサービス分離方式。サービス境界を適切に定義し、分散モノリスを避けます。サブドメインごとの分解とビジネス機能戦略ごとの分解。コンテキスト マッピング パターン。

🏗️ アーキテクチャ — レッスン 4 レッスン 4: サービスの分解 - 境界あり コンテキストとサービスの境界

マイクロサービスとマイクロ フロントエンドのシステム設計 — 基本から運用まで

パート 2: マイクロサービス バックエンドの設計

xdev.asia

はじめに

サービスの分離は、マイクロサービスに移行する際のアーキテクチャ上の最も重要な決定事項です。分割が小さすぎる → 複雑さが爆発します。分割が大きすぎる→分散モノリス。この記事では、サービス境界を適切に定義する体系的な方法について説明します。

サービス分解 — システムをマイクロサービスに分解します。


1. 分離の原則

1.1 サービスに対する単一の責任

各サービスは 独自のビジネス機能を担当します。

  • ユーザーサービス → ユーザーライフサイクル管理(登録、ログイン、プロフィール)
  • 製品サービス → 製品カタログ、検索、レビュー
  • 注文サービス → 注文処理、履行、履歴

1.2 2 つの主な戦略

ビジネス能力ごとに分解:

組織が提供するビジネス機能に基づいて、次のことを行います。

E-Commerce Business Capabilities:
├── Customer Management   → User Service
├── Product Management    → Product Service
├── Order Management      → Order Service
├── Payment Processing    → Payment Service
├── Inventory Management  → Inventory Service
└── Shipping & Delivery   → Shipping Service

サブドメインごとに分解 (DDD):

DDD 経由で識別されたサブドメインに基づいて:

Core Subdomains (competitive advantage):
├── Product Catalog → Product Service (custom-built, best team)
├── Order Processing → Order Service (complex logic)

Supporting Subdomains (necessary but not differentiating):
├── Inventory → Inventory Service
├── Customer Profile → User Service

Generic Subdomains (solved problems):
├── Authentication → Keycloak (off-the-shelf)
├── Payment Gateway → Stripe integration
├── Email → SendGrid/SES

1.3 正しいサービス境界標識

  • サービスは 独立して開発、展開、拡張可能
  • サービス A の変更でサービス B の変更が必要になることはほとんどありません
  • 各サービスには独自の データベースがあります (共有テーブルはありません)
  • チームは他のチームと 調整する必要なく サービスに取り組むことができます
  • サービスには 凝集した API があり、密接に関連したエンドポイント

2. コンテキスト マッピング パターン

境界コンテキストを特定したら、それらの間の関係を定義する必要があります。

2.1 パートナーシップ

2 つのチームは緊密に協力し、インターフェースを共同開発します。

Product Team ←→ Search Team
(cùng định nghĩa product schema cho search indexing)

2.2 顧客とサプライヤー

上流 (サプライヤー) はデータ/API を提供し、下流 (顧客) は以下を消費します。

Product Service (Supplier) → Order Service (Customer)
(Order Service cần product info nhưng không thay đổi product)

2.3 破損防止層 (ACL)

ドメイン モデルを外部/レガシー システムから保護するための変換レイヤー:

┌──────────┐     ┌─────┐     ┌──────────────┐
│ Order    │ ──► │ ACL │ ──► │ Legacy ERP   │
│ Service  │     │     │     │ (SOAP/XML)   │
└──────────┘     └─────┘     └──────────────┘
ACL convert REST/JSON ↔ SOAP/XML

3. アンチパターンは避けるべきです

3.1 分散モノリス

❌ Services phụ thuộc chặt chẽ:
Service A → Service B → Service C → Service A (circular!)
Kết quả: phải deploy A, B, C cùng lúc = worse than monolith

3.2 ナノサービス

❌ Chia quá nhỏ:
├── ProductNameService
├── ProductPriceService
├── ProductImageService
└── ProductReviewService

✅ Chia hợp lý:
└── ProductService (gom lại thành 1 service)

3.3 共有データベース

❌ Nhiều services dùng chung DB:
Service A ──┐
Service B ──┼──► Shared PostgreSQL (products table)
Service C ──┘
Thay đổi schema → break tất cả services

✅ Database per Service:
Service A → DB_A
Service B → DB_B (replicate data nếu cần)
Service C → DB_C

4. 実践: 電子商取引プラットフォームの分離

シリーズ全体のプロジェクトに適用可能:

E-Commerce Platform Services:

┌─────────────────────────────────────────┐
│ User Service (Supporting)               │
│ - Registration, Login, Profile          │
│ - PostgreSQL (users, addresses)         │
│ - Team: 2-3 devs                       │
├─────────────────────────────────────────┤
│ Product Service (Core)                  │
│ - Catalog, Search, Reviews, Categories  │
│ - PostgreSQL + Elasticsearch            │
│ - Team: 3-4 devs                       │
├─────────────────────────────────────────┤
│ Cart Service (Supporting)               │
│ - Add/Remove items, Apply coupon        │
│ - Redis (fast, ephemeral)              │
│ - Team: 2 devs                         │
├─────────────────────────────────────────┤
│ Order Service (Core)                    │
│ - Place order, Track, History           │
│ - PostgreSQL (orders, order_items)      │
│ - Team: 3-4 devs                       │
├─────────────────────────────────────────┤
│ Payment Service (Generic)               │
│ - Stripe/VNPay integration              │
│ - PostgreSQL (transactions)            │
│ - Team: 2 devs                         │
└─────────────────────────────────────────┘

概要

原則説明
ドメインごとに分割技術層ごとに分割せずに DDD 境界コンテキストを使用する
疎結合サービス A は、サービス B をデプロイする必要なく変更されます。
高い凝集力関連する機能は同じサービス内にあります
独自のデータ各サービスには独自のデータベースがあります。
適切なサイズ大きすぎず(モノリス)、小さすぎず(ナノサービス)

次の記事: レッスン 5: API 設計マスタークラス — REST、GraphQL、gRPC