CQRSのステップ
● 段階的CQRS
a. 書き込み / 読み込みモデルを分離する
b. 書き込み / 読み込みデータストアを分離する
c. イベントソーシングと統合する
→ 要件を見極めてどうするか判断すればよい
Slide 30
Slide 30 text
CQRS - 1.単一物理データストアモデル
● 書き込みと読み込みのモデルを別物として用意する
DB
Data
Model
User
Interface
Application
IF
IF
Slide 31
Slide 31 text
CQRS - 1.単一物理データストアモデル
● 書き込みと読み込みのモデルを別物として用意する
DB
Data
Model
User
Interface
Application
IF
IF
DB
User
Interface
IF
IF
Write
Model
Read
Model
Slide 32
Slide 32 text
CQRS - 1.単一物理データストアモデル
● 書き込みと読み込みのモデルを別物として用意する
● 書き込みモデル:
テーブル毎に対応したエンティティ等
● 読み込みモデル:
テーブルをJoinした結果、SQL viewの取得結果1行などを1モデルとする
→ それぞれ適したモデルを扱えるので、処理効率が良い書き方ができる
コードがシンプルになる
DB
Data
Model
User
Interface
Application
IF
IF
DB
User
Interface
IF
IF
Write
Model
Read
Model
Slide 33
Slide 33 text
CQRS - 2.複数物理データストアモデル
● 書き込みと読み込みのデータストアを物理的に分離する
DB
User
Interface
IF
IF
Write
Model
Read
Model
Slide 34
Slide 34 text
CQRS - 2.複数物理データストアモデル
● 書き込みと読み込みのデータストアを物理的に分離する
DB
User
Interface
IF
IF
Write
Model
Read
Model
Write Data
Store
Read Data
Store
User
Interface
IF
IF
Write
Model
Read
Model
Slide 35
Slide 35 text
CQRS - 2.複数物理データストアモデル
● 書き込みと読み込みのデータストアを物理的に分離する
● Read Data Store
○ シンプルなのはread-onlyのレプリカ
○ 全く別の機構を選択することも可能 (Readをelastic searchにするなど)
→ 参照/更新のストア分離により、それぞれの負荷に合わせたスケーリングが可能
異なるアーキテクチャのデータストアを利用可能
DB
User
Interface
IF
IF
Write
Model
Read
Model
Write Data
Store
Read Data
Store
User
Interface
IF
IF
Write
Model
Read
Model
メリット デメリット
Hibernate
(Spring Data JPA)
モデルに振る舞いを持たせやすい
SpringDataJPAがDDDを想定した仕様
仕様の理解しにくさ、キャッシュなどのトラブ
ル、想定外の挙動 etc..
MyBatis SQLを直接かけるのでシンプル、安心 SQLがテキスト記述、
XMLに設定を書くのは今時結構辛い
jOOQ タイプセーフなDSLで書きやすい、
読みやすい
オブジェクトリレーションの表現に
制限あり
ORM選定
→Writer Model ORMにHibernate、Read Model ORMにjOOQを採用
Slide 50
Slide 50 text
CQRSを適用するための
アーキテクチャ
Slide 51
Slide 51 text
● 一般的な3層アーキテクチャの問題
○ Write/Readのモデル使用範囲を明確に分けられない
○ BusinessLogic層がFatになりやすい
アーキテクチャ
Business
Logic
Data
User
Interface
Infrastructure
Slide 52
Slide 52 text
● 業務ロジックをドメイン層に凝集する
● アプリケーションサービス層はドメイン層が許可した操作を必要に応じて呼ぶ
● この辺りはDDDの思想に基づいた設計
アーキテクチャ
Business
Logic
Data
User
Interface
Infrastructure
Application
Service
Domain
Model
User
Interface
Infrastructure
(@little_hand_s から参考資料たどれます
「ドメイン駆動 + オニオンアーキテクチャ概略」 )
Slide 53
Slide 53 text
interface
アーキテクチャ
Application
Service
Domain
Model
User
Interface
Infrastructure
Application
Service
Domain
Model
User
Interface
Infrastructure
実装クラス
● ドメイン層をPOJOにするために依存関係を逆転する
● ドメイン層が公開したIFに対してインフラ層が実装する設計
Slide 54
Slide 54 text
● ドメイン層をWrite Model (ドメインモデル)とRead Modelに分割する
● インフラ層の実装クラスをWriteとReadで異なるORMで実装する
アーキテクチャ
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
Application
Service
Domain
Model
User
Interface
Infrastructure
interface
実装クラス
Slide 55
Slide 55 text
アーキテクチャ
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
<>
Repository
Entity
Repository Impl
<>
Query Serivce
DTO
Query Serivce
Impl
Slide 56
Slide 56 text
Spring Data
JPA
アーキテクチャ
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
<>
Repository
Entity
Repository Impl
<>
Query Serivce
DTO
Query Serivce
Impl
Hibernate
Hibernate(アノテーションだけ)
Slide 57
Slide 57 text
Spring Data
JPA
アーキテクチャ
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
<>
Repository
Entity
Repository Impl
<>
Query Serivce
DTO
Query Serivce
Impl jOOQ
Hibernate
Hibernate(アノテーションだけ)
Spring Data
JPA
アーキテクチャ
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
<>
Repository
Entity
Repository Impl
<>
Query Serivce
DTO
Query Serivce
Impl jOOQ
Hibernate
Hibernate(アノテーションだけ)
Q&A
● アプリケーションサービスはコマンド系・クエリ系でクラスを分ける?
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
Slide 84
Slide 84 text
Q&A
● アプリケーションサービスはコマンド系・クエリ系でクラスを分ける?
→ 分けたほうが使用するモジュールにに間違いないことが判別しやすい。
でもどちらも可
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
Slide 85
Slide 85 text
● QueryServiceはUIから直接参照させてもよいのでは?
Q&A
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
<>
Query Serivce
DTO
Query Serivce
Impl
Slide 86
Slide 86 text
● QueryServiceはUIから直接参照させてもよいのでは?
→どちらでも可、要件次第。
今回はApplicationServiceを挟んでよかった。
○ テスト単位がApplicationServiceというレイヤで統一できる
○ 単純な条件抽出以外の処理を分岐したい場合、
その制御をApplicationServiceに任せられる
■ 操作ユーザーの情報に応じて
処理を分岐
■ 権限制御、抽出条件変更など
Q&A
Application
Service
Domain
Model
Query
Model
User
Interface
Infrastructure
<>
Query Serivce
DTO
Query Serivce
Impl