event-sourcing について
event-sourcingは、現在の状態だけでなく、状態変化を不変のイベント列として記録するシステム設計のスキルです。イベントストア、プロジェクション、スナップショットに加え、イベントのバージョン管理や並行制御の実践方法を扱います。
主な機能
- 01不変イベント列による状態保存
- 02TypeScriptとPostgreSQLのイベントストア
- 03読み取りモデル向けプロジェクション
- 04性能向上のためのスナップショット
- 05イベントのバージョン管理と並行制御
活用シーン
- 01監査証跡の維持
- 02過去時点の状態の照会
- 03イベント駆動マイクロサービスの実装
- 04CQRSシステムの構築
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ aj-geddes/ useful-ai-prompts --skill event-sourcingインストール後、Claude Code で/event-sourcingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/event-store-typescript.mdevent-store-with-postgresql.mdprojections-read-models.mdsnapshots-for-performance.mdscripts/scaffold-analysis.shtemplates/notebook-template.py詳細
イベントソーシング
目次
概要
現在の状態ではなく、状態の変更をイベントのシーケンスとして保存することで、時間軸に沿ったクエリ、監査証跡、イベントの再生を可能にします。
使用する場面
- 監査証跡が必要な場合
- 時間軸に沿ったクエリ(任意の時点での状態)
- イベント駆動型マイクロサービス
- CQRS の実装
- 金融システム
- 複雑なドメインモデル
- デバッグと分析
- コンプライアンスと規制
クイックスタート
最小限の実行可能な例:
interface DomainEvent {
id: string;
aggregateId: string;
aggregateType: string;
eventType: string;
data: any;
metadata: {
userId?: string;
timestamp: number;
version: number;
};
}
interface Aggregate {
id: string;
version: number;
}
class EventStore {
private events: DomainEvent[] = [];
async appendEvents(
aggregateId: string,
expectedVersion: number,
events: Omit<DomainEvent, "id" | "metadata">[],
// ... (see reference guides for full implementation)
リファレンスガイド
詳細な実装については、references/ ディレクトリを参照してください。
| ガイド | 内容 |
|---|---|
| イベントストア(TypeScript) | イベントストア(TypeScript) |
| プロジェクション(読み取りモデル) | プロジェクション(読み取りモデル) |
| PostgreSQL を使用したイベントストア | PostgreSQL を使用したイベントストア |
| パフォーマンス向上のためのスナップショット | パフォーマンス向上のためのスナップショット |
ベストプラクティス
✅ 推奨事項
- イベントを不変の状態で保存する
- イベントにバージョンを付ける
- 楽観的同時実行制御を使用する
- パフォーマンス向上のためにスナップショットを作成する
- クエリにはプロジェクションを使用する
- イベントを小さく、目的に絞ったものにする
- メタデータ(タイムスタンプ、ユーザーなど)を含める
- イベントのバージョン管理と移行に対応する
❌ 避けるべき事項
- 過去のイベントを変更する
- 現在の状態だけを保存する
- 同時実行チェックを省略する
- 読み取りにイベントストアをクエリする
- イベントを大きくしすぎる
- イベントスキーマの進化を考慮しない
コメント
Markdown 対応