cqrs-event-sourcing について
CQRS と Event Sourcing を用いたシステム設計のガイドです。コマンドとクエリの分離、変更不能なイベント履歴、プロジェクション、一貫性、ドメイン設計を扱います。
主な機能
- 01コマンドとクエリの分離
- 02変更不能なイベントによる状態記録
- 03読み取りモデルのプロジェクション
- 04一貫性と集約の設計指針
- 05実装向けリファレンス
活用シーン
- 01監査履歴が必要なシステムの設計
- 02過去時点の状態の照会
- 03読み書きの負荷が異なるシステムの拡張
- 04イベント駆動アプリケーションの構築
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ nickcrew/ claude-cortex --skill cqrs-event-sourcingインストール後、Claude Code で/cqrs-event-sourcingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/best-practices.mdconsistency-patterns.mdcqrs-patterns.mdevent-sourcing.mdevent-store-tech.md詳細
CQRS とイベントソーシングのパターン
Command Query Responsibility Segregation(CQRS)とイベントソーシングのパターンを実装し、完全な履歴追跡と最適化された読み取り/書き込みモデルを備えた、スケーラブルで監査可能なシステムを構築するための専門的なガイダンスです。
このスキルを使用する場面
- 完全な監査証跡とコンプライアンスが必要なシステムを構築する場合
- 時系列クエリ(「時刻 T における状態を表示」)を実装する場合
- 複雑なドメインロジックを持つ大規模なアプリケーションを設計する場合
- 読み取りと書き込みのパターンが大きく異なるシステムを作成する場合
- 過去の再生機能を備えたイベント駆動型アーキテクチャを構築する場合
- 複数の読み取りモデルのプロジェクションが必要なシステムを実装する場合
- 「何が起きたか」の把握が重要なアプリケーションを設計する場合
- 競合解決が必要な共同作業システムを構築する場合
基本原則
1. コマンドとクエリの分離
状態を変更する操作(コマンド)と、状態を読み取る操作(クエリ)を分離します。
| コマンド(書き込み) | クエリ(読み取り) |
|---|---|
| 意図を表現します(CreateOrder、UpdatePrice) | データを返し、状態は変更しません |
| 拒否される場合があります(検証エラー) | キャッシュや最適化が可能です |
| データではなく、成功/失敗を返します | 異なるニーズに対応する複数のモデルを使用します |
| システムの状態を変更します | 書き込みに対して結果整合性を保ちます |
2. 信頼できる情報源としてのイベント
現在の状態のスナップショットではなく、状態の変更を不変のイベントとして保存します。
従来の方式:現在の状態を保存します → UPDATE users SET email = '[email protected]'
イベントソーシング:起きたことを保存します → APPEND UserEmailChanged event
結果:完全な履歴、時系列クエリ、監査証跡
3. 結果整合性
スケーラビリティのため、書き込みモデルと読み取りモデル間の一時的な不整合を許容します。
4. ドメイン駆動設計との統合
- 集約がビジネス不変条件を適用します
- イベントがドメイン上の事実を表します
- コマンドがドメイン操作を表現します
- 境界づけられたコンテキストが整合性境界を定義します
クイックリファレンス
| タスク | 参照先 |
|---|---|
| CQRS の実装パターン | skills/cqrs-event-sourcing/references/cqrs-patterns.md |
| イベントソーシングとスナップショット | skills/cqrs-event-sourcing/references/event-sourcing.md |
| EventStoreDB と Axon Framework | skills/cqrs-event-sourcing/references/event-store-tech.md |
| 整合性パターン | skills/cqrs-event-sourcing/references/consistency-patterns.md |
| ベストプラクティスのチェックリスト | skills/cqrs-event-sourcing/references/best-practices.md |
ワークフロー
- CQRS/ES が適切かどうかを確認します(監査、時系列、またはスケーラビリティのニーズが高い場合)
- ユーザーの意図を表現するコマンドを設計します
- イベントを不変の事実として定義します(過去形の命名)
- 集約を整合性境界として実装します
- 特定のクエリニーズに最適化したプロジェクションを作成します
- 境界づけられたコンテキスト間の結果整合性を処理します
よくある間違い
- 単純な CRUD アプリケーションに CQRS を使用する(過剰な設計)
- 複数の整合性境界にまたがる大きな集約を作る
- 発行後にイベントを変更または削除する
- 集約の処理前にコマンドを検証しない
- イベントハンドラーに冪等性を持たせない
- イベントスキーマの進化に対応するバージョニング戦略がない
- 集約間を強く結合する(ID 参照のみを使用してください)
リソース
- 書籍:「Implementing Domain-Driven Design」(Vernon)、「Event Sourcing & CQRS」(Betts et al)
- サイト:cqrs.wordpress.com、eventstore.com/blog、axoniq.io/resources
- ツール:EventStoreDB、Axon Framework、Marten、Eventuous
- パターン:イベントソーシング、CQRS、プロセスマネージャー、Saga、スナップショット
コメント
Markdown 対応