Closed8

ドメイン駆動設計とマイクロサービスとアーキテクチャとCQRSとイベントソーシングの勉強でサンプルプロジェクトを作ってみた

ピン留めされたアイテム
前田みお前田みお

サンプルプロジェクト

https://github.com/m10maeda/itddd/tree/main

元にした要件は、書籍「ドメイン駆動設計入門: ボトムアップでわかる!ドメイン駆動設計の基本」のサークル管理システム

前田みお前田みお

元ネタの要件にある、サークル参加者のユーザー種別がプレミアムユーザーの人数によって、最大参加者の制限が変わるような部分は未対応

前田みお前田みお

ユースケース

  • プロフィールの登録
  • プロフィールの閲覧
  • プロフィールの更新
  • プロフィールの削除
  • サークルの登録
  • サークルの閲覧
  • サークルの更新
  • サークルの削除
  • メンバーをサークルに追加
  • メンバーをサークルから除外
  • サークルオーナーの変更
前田みお前田みお

アーキテクチャ

プロフィールとサークルの管理をそれぞれ別のバックエンドとして構成して、フロントエンドからバックエンドを呼び出す構成
バックエンド同士の連携は、クエリは HTTP、コマンドはイベント(Kafka)を使って実現

前田みお前田みお

Profiles

オーソドックスなレイヤードアーキテクチャで構成
アプリケーションサービスを使ってシステムのユースケースを実現
リポジトリは永続化指向を意識していて、明示的に保存することが必要になる

前田みお前田みお

Circles

ヘキサゴナルアーキテクチャやクリーンアーキテクチャ、CQRS、イベントソーシングを意識した構成
システムのユースケースはポートを使って実現
コマンドに当たるポートは Interactor として実装し、クエリに当たるポートはインフラ層のクエリサービスとして実装
リポジトリはコレクション指向を意識して、明示的に保存を要求しなくてもデータが更新されるように
これにはイベントソーシングを使って、イベント履歴から最新の集約を復元することで実現

前田みお前田みお

サービス間の連携

プロフィールが削除された時、所属サークルから自動的に脱退するようにしている
これは、ProfileDeleted イベントが発行された時に Kafka にメッセージを発行、購読している Circles システムがメッセージを受診したら、所属サークルから該当のメンバーを除外するようにしている

このスクラップは2025/01/06にクローズされました