Loading...

[Update] MBC CQRS サーバーレス フレームワーク v1.7.0 をリリース

MBC CQRS サーバーレス フレームワーク v1.7.0 をリリースしました。今回のリリースでは、コマンドの受け付けを DynamoDB の条件チェックとアトミックに判定できる「コマンド受付条件(Command Admission)」を追加しました。メンテナンス中に設定の更新だけを止めたい場合などに、事前チェックとコマンド書き込みの間に生じる競合を防げます。実行時の破壊的変更はなく、新しいフックを使わないアプリケーションはコードを変更せずにアップグレードできます。

主な変更点

新機能

  • core(コマンド受付条件): CommandService に protected フック getCommandAdmissionConditions(command, options) を追加しました。CommandService を継承したクラスでこのフックをオーバーライドし、DynamoDB の ConditionCheck を返すと、コマンドの初回書き込みと同じ TransactWriteItems で一緒にコミットされます。たとえば「メンテナンスの世代番号が、リクエストを受けた時点から変わっていない場合だけ受け付ける」といった制御を、別途の事前チェックで起こる競合なしに実現できます。フックの既定値は空で、その場合は従来どおりの条件付き PutItem で書き込まれます。
  • core(新しい例外): トランザクションがキャンセルされた理由に応じて、例外を分類するようにしました。受付条件のチェックが失敗した場合は CommandAdmissionRejectedException(409)、コマンド自体の条件(バージョン競合)が失敗した場合は従来どおり ConditionalCheckFailedException(409)、TransactionConflict の場合は CommandAdmissionContentionException(503)になります。フレームワークは自動でリトライしません。
  • cli(インフラテンプレート): mbc new で作成するプロジェクトの Lambda ロールに dynamodb:ConditionCheckItem を追加しました。

アップグレード時の注意

  • ユニットテストのモック: CommandService はコマンドの初回書き込みに、DynamoDbService.putItem ではなく新しい putItemWithConditions を使うようになりました。本物の CommandService を、putItem だけを持つ手書きの DynamoDbService モックと組み合わせているテストは失敗します。モックに putItemWithConditions を追加してください。@golevelup/ts-jest の createMock による自動モックではエラーになりませんが、putItem は呼ばれなくなるため、putItem の呼び出しを検証しているテストは失敗します。本物の DynamoDbService の putItem を jest.spyOn で監視しているテストは、そのまま動きます。
  • IAM(フックを使う場合のみ): 受付条件のチェック対象テーブルに対して dynamodb:ConditionCheckItem の権限が必要です。既存のプロジェクトには自動で追加されないため、Lambda ロールに手動で追加してください。
  • キャパシティと競合: トランザクションでは、項目ごとに通常の 2 倍のキャパシティを消費します(キャンセルされた場合も同様です)。同じ項目を多数のコマンドが同時にチェックすると、TransactionConflict(503)が発生する可能性があります。DynamoDB Local では再現しないため、実際の DynamoDB で想定する同時実行数での負荷試験をおすすめします。

ドキュメント

  • ドキュメントサイトの CommandService にコマンド受付条件の節を、エラーカタログに新しい例外を、ユニットテストに DynamoDbService のモックの書き方を追加しました。
  • GitHub リポジトリに、設計を解説したガイドと、メンテナンス中の更新停止やデータ移行を実装した実行可能なサンプルを追加しました。
  • mcp-server: mbc-migrate スキルに v1.6.0 → v1.7.0 の移行ガイドを追加し、互換性マトリックスに v1.7.0 を追加しました。

アップグレード方法

npm install @mbc-cqrs-serverless/core@1.7.0

ほかの @mbc-cqrs-serverless/* パッケージを使っている場合は、同じバージョンにそろえてください。新しいプロジェクトは npm i -g @mbc-cqrs-serverless/cli@1.7.0 でインストールした CLI の mbc new で作成できます。テストのモックや IAM の変更点は、ドキュメントサイトの「移行ガイド: v1.7.0」をご覧ください。

関連リンク

Top