Dev Study
AWSサービスの内部原理 コース

10. RCUとWCUの正体 — 課金単位はI/Oの量である

RCUとWCUを丸暗記の呪文ではなく、レプリカ群が消費する資源から図で再導出していきましょう。

①課金の物差しは回数でなくサイズ

RCU/WCUの定義
1 RCU強整合の読み取り 1回/秒
最大4KBまで
1 WCU書き込み 1回/秒
最大1KBまで
サイズ÷区切りを切り上げ
3KBを強整合で読む3÷4=0.75 → 1 RCU
512Bを書く0.5 → 1 WCU
  • ・結果整合なら同じ1 RCUで1秒に2回読める(半額)

課金単位は「何回叩いたか」でなく「どれだけのサイズを、どの整合性で読み書きしたか」。区切りを超える分は切り上げ。

②なぜサイズで測るのか — API の下の実体

1回の読み書きの中身
読み書きAPI 1回抽象的な呼び出し
実体は(複数AZの3レプリカ)
レプリカAB木+WAL
レプリカBB木+WAL
レプリカCB木+WAL
実際に消費するのは
ディスクI/O帯域有限の資源
CPU時間有限の資源
  • ・大きいアイテム=運ぶバイトが多い=コストが高い
  • ・回数だけで数えると、巨大アイテムと小アイテムが同じ扱いになり実態とずれる

1回の読み書きの下ではレプリカ群が実際にI/OとCPUを使う。だからサイズ課金のほうが消費資源に忠実。

③書き込みの単位が1KBと小さい理由

読みと書きの重さの違い
読み取り 4KB/1RCUレプリカに聞いて返すだけ
書き込み 1KB/1WCU何段も仕事を引き連れる
書き込みはまず
WALに追記リーダーレプリカ
さらに複製を伝播
レプリカB内容を揃える
レプリカC内容を揃える
  • ・4KB/1KBの数字自体はAWSが定めた課金上の区切り(由来は非公表)
  • ・「読みより書きの単位が小さい」非対称は、書き込みの高コストと整合する

書き込みはログ追記+複製伝播を伴う重い操作。だから単位を読みの1/4に小さく取って実コストを釣り合わせる。

④結果整合の読み取りが半額な理由

どのレプリカに聞けるか
強整合の読み取り聞けるレプリカが限られる
1RCU=1回/秒
結果整合の読み取りどのレプリカに聞いてもよい
1RCU=2回/秒
読み負荷を3コピーに分散
レプリカA
レプリカB
レプリカC
  • ・触るサーバーはどちらも基本1台。違いは「どれに聞いてよいか」
  • ・公式: 強整合は結果整合の2倍のデータベース資源を消費
  • ・既定は安い結果整合、書いた直後を確実に読み返すときだけ強整合

結果整合は3コピーに読みを分散でき、同じハードで約2倍さばける。だから同じ1 RCUで2回ぶん働ける。

⑤有限資源をどう確保するか — 2つのモード

予約で押さえるか、実績で追うか
有限資源レプリカ群のI/OとCPU
確保のしかたが2通り
プロビジョンドRCU/WCUを事前予約(QoS)
未使用分を最大300秒ぶん貯金(バースト)
オンデマンド従量課金・実績に追随
直前ピークの2倍まで即応
限度を超え続けると
スロットリング一時的に拒否
  • ・オンデマンドでも直前ピークの2倍を30分以内に超える急増は要注意
  • ・急増が読めるなら事前ウォームアップか30分以上かけた漸増を

どちらのモードも根っこは同じ有限資源。先取りで予約するか、実績に追わせるかの違いだけ。

サンプルコード(フレームワーク環境が必要なため表示のみ)

// RCU/WCU の消費はサイズで決まる(公式の計算例)
//   読み取り: アイテムサイズ ÷ 4KB を切り上げ → 消費RCU(強整合1回ぶん)
//     例) 3KB のアイテムを強整合で読む: 3 / 4 = 0.75 → 切り上げ 1 RCU
//         結果整合なら同じ 1 RCU で 1秒に 2回読める(半額)
//   書き込み: アイテムサイズ ÷ 1KB を切り上げ → 消費WCU
//     例) 512B のアイテムを書く: 512B / 1KB = 0.5 → 切り上げ 1 WCU

// プロビジョンドモード: RCU/WCU を事前に予約する(有限資源の先取り=QoS)
aws dynamodb create-table --table-name Orders \
  --attribute-definitions AttributeName=OrderId,AttributeType=S \
  --key-schema AttributeName=OrderId,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=80,WriteCapacityUnits=100

// オンデマンドモード: 事前申告なし。実績に追随して自動で伸びる(直前ピークの2倍まで即応)
aws dynamodb create-table --table-name Orders \
  --attribute-definitions AttributeName=OrderId,AttributeType=S \
  --key-schema AttributeName=OrderId,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST
公式ドキュメントで詳しく ↗