イベントソーシングパターン
このドキュメントでは、MBC CQRS Serverlessにおけるイベントソーシングの実装について説明します。
イベントソーシング概要
イベントライフサイクル
DynamoDBイベントストアスキーマ
キー構造
イベントストレージ用のDynamoDBキー構造:
- PK (Partition Key):
{TENANT}#{ENTITY_TYPE}(例:TENANT001#ORDER) - SK (Sort Key):
{ENTITY_TYPE}#{ID}@{version}(例:ORDER#20240101-001@1)
イベントレコード例
{
"pk": "TENANT001#ORDER",
"sk": "ORDER#20240101-001@1",
"version": 3,
"type": "OrderCreated",
"data": {
"orderId": "20240101-001",
"customerId": "CUST-001",
"items": [],
"totalAmount": 15000
},
"createdAt": "2024-01-01T10:00:00Z",
"createdBy": "user-123"
}
楽観的ロック
同時更新時のデータ整合性を確保するための楽観的ロックメカニズムについて説明します。
バージョン管理の実装
// コマンドサービスがバージョニングを自動的に処理
await this.commandService.publishAsync(entity, {
invokeContext: context,
});
// DynamoDBのConditionExpressionが楽観的ロックを確保
// ConditionExpression: 'attribute_not_exists(pk) AND attribute_not_exists(sk)'
// skにはバージョン番号が含まれており、同一バージョンのコマンドの重複書き込みを防ぎます