Amazon DynamoDB Accelerator (DAX) でマイクロ秒レイテンシを実現 - インメモリキャッシュの設計
DAX による DynamoDB の読み取り高速化、キャッシュ戦略、クラスタ設計を解説します。
DAX の概要
DAX は DynamoDB のインメモリキャッシュで、読み取りレイテンシをミリ秒からマイクロ秒に短縮します。ElastiCache (Redis/Memcached) と異なり、DynamoDB 互換の API を提供するため、SDK のエンドポイントを DAX クラスタに変更するだけで移行が完了します。DAX クラスタは VPC 内に配置され、クラスタ内の各ノードが同じキャッシュデータのレプリカを保持します。プライマリノードが書き込みを処理し、レプリカノードが読み取りを分散する構成で、プライマリ障害時にはレプリカが自動昇格します。
キャッシュ戦略とクラスタ設計
アイテムキャッシュは GetItem と BatchGetItem の結果をキャッシュし、TTL (デフォルト 5 分) で自動失効します。クエリキャッシュは Query と Scan の結果セットをキャッシュします。書き込みスルーにより、PutItem や UpdateItem の実行時にキャッシュも更新されるため、読み取り時に古いデータが返されるリスクが低減します。クラスタは最低 3 ノード (マルチ AZ) を推奨し、ノードタイプはキャッシュするデータ量に応じて選択します。dax.r5.large (メモリ 13.5 GB) は中規模ワークロード向け、dax.r5.xlarge (メモリ 27 GB) は大規模なホットデータセットを持つ場合に適しています。
キャッシュ戦略と整合性
DAX はアイテムキャッシュとクエリキャッシュの 2 層でキャッシュを管理します。アイテムキャッシュは GetItem と BatchGetItem の結果を TTL (デフォルト 5 分) で保持します。クエリキャッシュは Query と Scan の結果を保持します。書き込み操作 (PutItem 、 UpdateItem 、 DeleteItem) はライトスルーで DAX と DynamoDB の両方に反映されます。結果整合性の読み取りはキャッシュから返され、強い整合性の読み取りは DynamoDB に直接アクセスします。 TTL を短く設定するとキャッシュヒット率が下がり、長く設定するとデータの鮮度が低下するトレードオフがあります。 DynamoDB キャッシュのパフォーマンス最適化を学ぶうえで関連書籍 (Amazon)が参考になります。
DAX と ElastiCache の比較
DAX は DynamoDB 専用のキャッシュであり、DynamoDB SDK を置き換えるだけで導入できる点が最大の利点です。アプリケーション側にキャッシュの無効化ロジックやキー設計を実装する必要がなく、ライトスルーで整合性が自動維持されます。一方 ElastiCache (Redis) は DynamoDB 以外のデータソース (RDS、外部 API レスポンス) もキャッシュ可能で、Pub/Sub やソート済みセットなどのデータ構造を活用できます。DAX のクエリキャッシュはパラメータの完全一致でヒット判定するため、Query のフィルタ条件が頻繁に変わるワークロードではヒット率が低下します。この場合は ElastiCache でアプリケーション側のキャッシュキーを設計する方が効率的です。DAX はトランザクション API (TransactGetItems / TransactWriteItems) をキャッシュしないため、トランザクション中心のワークロードでは効果が限定的です。
設計の落とし穴と運用上の注意点
DAX クラスタは VPC 内に配置する必要があり、Lambda から接続する場合は Lambda を同じ VPC に配置するか、VPC エンドポイント経由でアクセスします。Lambda を VPC に配置するとコールドスタート時間が増加するため、Provisioned Concurrency との併用を検討します。DAX のノード障害時、クライアント SDK は自動的にリトライしますが、フェイルオーバー中 (数秒間) は読み取りレイテンシがミリ秒単位に戻ります。アプリケーションはこの一時的なレイテンシ増加を許容する設計にします。アイテムキャッシュとクエリキャッシュの TTL は独立して設定でき、書き込み頻度の高いテーブルではアイテムキャッシュ TTL を 1 分以下に短縮し、クエリキャッシュ TTL をさらに短くすることでデータ鮮度を維持します。クラスタのスケールアウト (ノード追加) はオンラインで実行可能ですが、スケールイン (ノード削除) はキャッシュデータの再分散を伴うため、低トラフィック時間帯に実施します。
DAX の料金
DAX の料金はノードの時間課金で、dax.r5.large は 1 時間あたり約 0.269 ドル (月額約 194 ドル) です。最低 3 ノード (マルチ AZ) の構成が推奨され、月額約 582 ドルです。DynamoDB の読み取りキャパシティユニット (RCU) のコスト削減効果と DAX のノードコストを比較し、読み取りが多いワークロードで DAX の導入が有利かを判断します。キャッシュヒット率が 90% 以上の場合、DynamoDB の RCU を大幅に削減でき、DAX のコストを上回る削減効果が期待できます。
まとめ
DAX は DynamoDB のインメモリキャッシュで、マイクロ秒単位の読み取りレイテンシを実現するサービスです。ライトスルーキャッシュで書き込みの整合性を維持しながら、アイテムキャッシュとクエリキャッシュの 2 層で読み取り負荷を大幅に軽減します。DynamoDB の RCU コスト削減効果がキャッシュヒット率 90% 以上で顕著になり、読み取り集中型ワークロードに最適です。