Data Sync Handlerの実装例
このガイドでは、DynamoDB(コマンドソース)からRDS(クエリデータベース)にデータを自動的に同期するData Sync Handlerの実装方法を説明します。これはCQRS読み取りモデルを可能にする中核的なメカニズムです。
このガイドを使用するタイミング
以下の場合にこのガイドを使用してください:
- 複雑なクエリのためにエンティティデータをDynamoDBからMySQL/PostgreSQLに同期する
- ネストされたJSON属性をリレーショナルカラムに変換する
- 同じDynamoDBテーブル内の異なるレコードタイプを処理する
- 親子関係(Order、OrderItem)を個別に処理する
このパターンが解決する問題
| 問題 | 解決策 |
|---|---|
| DynamoDBはJOINや複雑なフィルターができない | SQLクエリのためにデータをRDSに同期 |
| SKのバージョンサフィックスが重複レコードを引き起こす | upsert前にremoveSortKeyVersion()を使用 |
| 異なるレコードタイプは 異なるRDSテーブルが必要 | ハンドラーでSKプレフィックスによりフィルター |
| JSON属性を検索可能なカラムにする必要がある | 属性を個別のRDSカラムにマッピング |
基本構造
すべてのData Sync Handlerは以下の基本構造に従います:
import { CommandModel, IDataSyncHandler, removeSortKeyVersion } from "@mbc-cqrs-serverless/core";
import { Injectable, Logger } from "@nestjs/common";
import { PrismaService } from "src/prisma";
@Injectable()
export class EntityDataSyncRdsHandler implements IDataSyncHandler {
private readonly logger = new Logger(EntityDataSyncRdsHandler.name);
constructor(private readonly prismaService: PrismaService) {}
async up(cmd: CommandModel): Promise<any> {
// Sync data to RDS
}
async down(cmd: CommandModel): Promise<any> {
// Optional: Handle rollback (usually just logs)
this.logger.debug(cmd);
}
}