← AWSサービスの内部原理 コース
10. RCUとWCUの正体 — 課金単位はI/Oの量である
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 の下の実体
読み書き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