ddd-microservices について
ドメイン駆動設計でマイクロサービスを設計する開発者向けのスキルです。サービス境界、集約、通信方式、データ所有権、一貫性戦略を扱います。
主な機能
- 01境界づけられたコンテキストをサービスに対応
- 02集約とドメインイベントの定義
- 03同期・非同期通信の選択
- 04サービスごとのデータ所有権の設定
- 05結果整合性と Saga パターンの計画
活用シーン
- 01分割前にサービス境界を特定
- 02REST、gRPC、イベントの契約を設計
- 03サービス間の一貫性を計画
- 04サービスごとのデータベース所有権を定義
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ partme-ai/ full-stack-skills --skill ddd-microservicesインストール後、Claude Code で/ddd-microservicesを入力して読み込まれたか確認します。
同梱ファイルLICENSE.txt
詳細
このスキルを使うタイミング
ユーザーが以下を希望する場合は、このスキルを使います。
- DDDを使用してマイクロサービスの境界(境界づけられたコンテキスト、集約、ドメインイベント)を定義する
- サービス間のコントラクトとイベント駆動型の通信を設計する
- サービス間の整合性、クエリ、運用戦略を実装する
- 同期通信(REST/gRPC)と非同期通信(イベント/メッセージング)のどちらを使うか判断する
このスキルの使い方
ワークフロー
- 境界づけられたコンテキストをマッピングして、自然なサービス境界を特定します
- 各サービス内の集約を定義して、データの整合性を確保します
- 通信を設計します。クエリと強い整合性には同期通信を、疎結合には非同期通信(ドメインイベント)を使用します
- データの所有権を確保します。各サービスが独自のデータベースを所有し、APIまたはイベントを通じてデータを共有します
1. 境界づけられたコンテキストからサービスへのマッピング
E-Commerce Domain:
├── Order Service ← Order bounded context
│ ├── Order aggregate
│ └── OrderPlaced event
├── Inventory Service ← Inventory bounded context
│ ├── Product aggregate
│ └── StockReserved event
├── Payment Service ← Payment bounded context
│ ├── Payment aggregate
│ └── PaymentCompleted event
└── Notification Service ← Cross-cutting
└── Subscribes to all domain events
2. 同期通信(Feign/gRPC)
@FeignClient(name = "inventory-service")
public interface InventoryClient {
@GetMapping("/api/products/{id}/stock")
StockInfo getStock(@PathVariable String id);
}
3. 非同期通信(ドメインイベント)
// Order Service publishes
@Transactional
public void placeOrder(PlaceOrderCommand cmd) {
Order order = Order.create(cmd);
orderRepository.save(order);
eventPublisher.publish(new OrderPlacedEvent(order.getId(), order.getItems()));
}
// Inventory Service subscribes
@EventListener
public void onOrderPlaced(OrderPlacedEvent event) {
inventoryService.reserveStock(event.getItems());
}
4. サービスごとのデータベース
Order Service → order_db (PostgreSQL)
Inventory Service → inventory_db (PostgreSQL)
Payment Service → payment_db (PostgreSQL)
ベストプラクティス
- サービスに分割する前に境界づけられたコンテキストを明確に定義し、早まった分割を避けます
- 集約間およびサービス間の事実を表現するにはドメインイベントを使用し、冪等性と順序を確保します
- 各サービスについて、明確なSLA、データの所有権、障害の境界を定義します
- 分散トランザクションよりも、補償トランザクション(Sagaパターン)を用いた結果整合性を優先します
リソース
- Sam Newman著『Building Microservices』
- Eric Evans著『Domain-Driven Design』
- https://microservices.io/
キーワード
DDD、マイクロサービス、境界づけられたコンテキスト、集約、ドメインイベント、サービス境界、Sagaパターン、CQRS、サービスごとのデータベース、結果整合性、APIゲートウェイ
コメント
Markdown 対応