DynamoDBの強力な整合性のある読み込みでの料金

渡辺です。

確認しようとして検索してみたら公式ドキュメントしかヒットしなかったので、噛み砕いてまとめておきます。 調べに来る人は多分いるのでw

DynamoDB の読み込みモード

DynamoDB の読み込みでは、「結果整合性のある読み込み(Eventually Consistent Reads)」と「強力な整合性のある読み込み(Strongly Consistent Reads)」の2つのモードがあります。 デフォルトでは、「結果整合性のある読み込み」で、雑に言えば、「書き込みが成功してもそれが反映された最新のデータが取れる保証はないよ」というモードです。 書き込みは保証されるのですが、読み込みで取れるかどうかは別問題、DynamoDBの基本コンセプトです。

getやqueryのオプションで、 ConsistentRead 属性を true にすることで、「強力な整合性のある読み込み」を行うことができます。 この時、書き込んだ情報が取得できることが保証されます。 ただし、 グローバルセカンダリインデックス (GSI) では利用できません。

読み込みモードと料金

雑に言えば、 「強力な整合性のある読み込み」では読み込み時のコストが2倍 になります。

正確に言えば、「結果整合性のある読み込み」の場合、読み込の項目のサイズが 4KB 以下であれば、0.5 RCU(読み込みキャパシティユニット)です。 「強力な整合性のある読み込み」では 1 RCUになります。 4KB を超える場合は、それぞれ追加のRCUが必要です。

強力な整合性のある読み込みを使うべきか?

従来であれば、プロビジョニング済みキャパシティーモードしかなく、使用するキャパシティユニットを予測しなければなりませんでした。 このため、「強力な整合性のある読み込み」を使う場合、単純計算でキャパシティユニットを倍にする必要もありました。 ですが、現状はオンデマンドキャパシティーモードがあります。

オンデマンドキャパシティーモードでは、名前の通り、利用した分のキャパシティのみが課金対象となります。 アプリケーションの性質にもよりますが、API Gateway / Lambda / DynamoDB という鉄板構成では、オンデマンドにすることが概ね有効でしょう。 そうなってくると、基本的に「強力な整合性のある読み込み」を利用しても良いのでは?と思えてきます。 逆に、ここは「強力な整合性のある読み込み」は要らないかなという部分でのみ「結果整合性のある読み込み」という選択もありかもしれません。

ただし、グローバルセカンダリインデックス (GSI)で「強力な整合性のある読み込み」が利用できないことは忘れないで下さい。 アプリケーションの設計としては、DynamoDBが「結果整合性のある読み込み」が基本となっていることは忘れずに。

まとめ

DynamoDBの「強力な整合性のある読み込み」はコスト倍。 オンデマンドならガンガン使ってもいいかも。