データが存在しない場合のDynamoDBのスループット消費について調べた話とか

Amazon DynamoDBの料金体系はスループットとデータストレージが基準になっている。

aws.amazon.com

 

docs.aws.amazon.com

読み込みキャパシティーユニットは、最大サイズ 4 KB の項目について、1 秒あたり 1 回の強力な整合性のある読み込み、あるいは 1 秒あたり 2 回の結果的に整合性のある読み込みを表します。

 

読み込み対象の項目が存在しない場合、データのサイズは当然0になる筈だ。

であれば、その場合は読み込みキャパシティーユニット(RCU)が消費されないのではないか?とアホなことを考えたので、検証してみた。

 

[存在しない項目でもRCUは消費される]

結論としては、存在しない項目に対する読み込みであってもキャパシティーユニットは消費されるということが分かった。

 

AWSの公式ドキュメントにも、次のように明示的に記載されている。

docs.aws.amazon.com

存在しない項目に対して読み込みオペレーションを実行しても、DynamoDB ではやはりプロビジョンド読み込みスループットが消費されます。強力な整合性のある読み込みオペレーションでは、1 つの読み込みキャパシティーユニットが消費されますが、結果整合性のある読み込みオペレーションでは、半分の読み込みキャパシティーユニットが消費されます。

 

ちなみに、膨大に存在するAWSの公式ドキュメントから、お目当の記述を一発で見つけることができた訳ではない。

「DynamoDB no data consumed capacity」などのキーワードでグーグル先生に問い合わせた結果、以下のStackOverflowの回答を発見し、そこからAWSのドキュメントにたどり着くことができた。

stackoverflow.com

 

公式には記載がないのでは?という懸念もあったので、適当な英単語を組み合わせてググるという愚行を犯したが、最終的には公式ドキュメントに行き着くことになった。急がば回れと言うやつか。

 

[RCUが消費されるか検証してみた]

StackOverflowにサラッと書いてあるだけならともかく、公式ドキュメントにまでバッチリ書いてあるのだから、これ以上疑う余地はない。

ないのだが、念のため実際にテーブルを作って検証してみる。

 

検証の手順は以下の通り。

  1. テスト用のテーブルを作る(テーブル名:demo、パーティションキー:id、読み込むキャパシティーユニット:1、オートスケール:off)
  2. テーブルの作成完了を待つ
  3. aws cliで存在しないパーティションキーでget-itemリクエストを繰り返し投げる

 

作成しただけで、データを投入していないので、テーブルの項目数は0である。

 

手順3で利用したコマンドは以下。

aws dynamodb get-item --table-name demo --key '{"id":{"S":"1"}}'

 

AWS CLIに不慣れなので、最初は間違えて--key {"id":{"S":"1"}}というコマンドにしてしまっていたため、

Error parsing parameter '--key': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
JSON received: {id:{S:1}}

というエラーが出てしまった。これはシングルクオートでキーのJSONを囲むことで対処できた。

 

コマンドをひたすら実行しているターミナルの画面はこんな感じ。

f:id:kidani_a:20180808015304p:plain

 

しばらく待ってから、AWS Management ConsoleでRCUの変化を確認する。

f:id:kidani_a:20180808015256p:plain

しっかりキャパシティーが消費されていた。

存在するかどうか確認するためにDBに負荷がかかるのだから、それはそうだよな、という感じ。

 

[まとめ]

DynamoDBのスループットは読み込み対象のデータが存在しなくても消費される、というお話。

 

そういえばグローバルテーブル機能が東京リージョンに来たから、これも触ってみなくては。

aws.amazon.com

 

今日のブログ執筆BGMはこちら。

www.youtube.com