書き込みと運用

DynamoDB が SQL のユニークインデックスのように一意性を強制すると想定し、条件式なしでデプロイし、本番で重複アカウントを発見する。属性横断の制約はなく、あるのは自分で設計するアトミックな書き込みだけだ。

書き込みはアイテム単位で、硬い上限付きでバッチされ、1 つの忙しいパーティションキーがスロットルしているあいだ、テーブルの残りは暇を持て余していることがある。

ALTER TABLE がないので、移行はアプリケーションレベルだ。このセクションはバッチ API、戻り値、カウンター、一意性パターン、オンラインの形変え、そしてホットパーティションを扱う。

このセクションで身につくこと

  • 25 アイテム/16 MB の上限内で BatchWriteItem とバッチ削除を、黙った部分失敗なしに使える。
  • 条件付き書き込みでアトミックカウンターと複数属性の一意性を実装できる。
  • デュアルライトまたはバックフィルパターンでゼロダウンタイム移行を計画できる。
  • スロットリングの前に、書き込み分布とキー選択からホットパーティションを見つけられる。

読む順番

  1. バッチ操作:BatchGetItem と BatchWriteItem の上限、未処理キー、バッチがトランザクションではない理由。
  2. 複数アイテムの削除: BatchWriteItem、トランザクション、PartiQL とトランケート、そして DELETE … WHERE がない理由。
  3. ReturnValues:ALL_OLD、UPDATED_NEW、 2 回目の読み取りなしで何が返るか。
  4. アトミックカウンター:ADD 更新と、リトライしたインクリメントが二重に数えられる理由。
  5. 複数属性の一意性:一意性アイテムと重複を拒否する条件付き put。
  6. 移行:トラフィックが生きているあいだにキーと GSI を形変える。スキーマ移行ボタンはない。
  7. ホットパーティション:ホットキーの特定、書き込みシャーディング、ホットな読み取りのキャッシュ。
8 件中 0 件読了クイズ
DynamoDBのバッチ操作
DynamoDBのバッチ操作。BatchGetItemは1回で100件を読み、BatchWriteItemは25件を書く。バッチはトランザクションではないこと、そして未処理分の再試行方法。
中級読了 8 分
DynamoDBで複数のアイテムを削除する方法
DynamoDBで複数のアイテムを削除する方法(BatchWriteItem、TransactWriteItems、PartiQLバッチ、TTL)と、DELETE ... WHERE文が存在しない理由。
初級読了 9 分
DynamoDBのReturnValues:古いまたは新しいアイテムを取得する
DynamoDBのReturnValuesは、PutItem、UpdateItem、DeleteItemから2回目の読み取りなしで古いまたは新しいアイテムを返します。5つの選択肢と、それぞれが役立つ場面。
中級読了 5 分
DynamoDB のアトミックカウンター:ADD の仕組みと限界
DynamoDB のアトミックカウンターが ADD 更新式でどう動くか、なぜ冪等でないのか、そしてインクリメントを安全に再試行できるようにする方法。
中級読了 7 分
DynamoDB で複数の属性に一意性を課す
DynamoDB で複数の属性に一意制約を課す方法。メールとユーザー名の両方の一意性を、マーカー項目と条件付きの TransactWriteItems で保証します。
上級読了 6 分
ダウンタイムなしの DynamoDB 移行
ダウンタイムなしの DynamoDB 移行。オンライン GSI、ガード付きのバックフィル、デュアルライトで、稼働中のテーブルへ新しいエンティティ型とアクセスパターンを追加する方法。
上級読了 6 分
DynamoDB のホットパーティション:見つけ方と直し方
DynamoDB のホットパーティションとは、1つのパーティションキーが1パーティションでさばける以上のトラフィックを受けている状態です。Contributor Insights でキーを特定し、シャーディングで分散させます。
中級読了 11 分
理解度チェッククイズに挑戦
このセクションで学んだ内容を確認しましょう。

TransactWriteItems は最大 100 アクションを受け付けるが、同じアイテムに 2 つのアクションを置くことはできず、合計サイズの上限は 4 MB。

キャンセルされたトランザクションはアクションごとに理由を返す。たとえば ConditionalCheckFailed、TransactionConflict、ThrottlingError で、それぞれ別のリトライ戦略に対応する。

BatchWriteItem は 25 リクエストが上限で、失敗時に兄弟をロールバックしないので、アプリケーションコードで UnprocessedItems を扱う。

条件式で compare-and-swap ができ、ReturnValues は後続の GetItem なしに古いアイテムまたは新しいアイテムを返す。

アトミックカウンターは数値属性への ADD を使う。属性横断の一意性には、一意値ごとの別「ロック」アイテムが必要で、本行と一緒に 1 つの条件付きトランザクションで書き込む。

ホットな USER#popular パーティションをバックフィルする移行は、そのキーへの書き込みをスロットルしうる。

ReturnConsumedCapacity で測った書き込み予算に合わせてバックフィルのペースを調整し、 WriteKeyRangeThroughputThrottleEvents(パーティションの上限でスロットルされた書き込み)にアラームを設定する。移行ガイドにガード付きのスイープがある。

Workbench の手順

DynoTable では、書き込みはデフォルトでステージされる。アイテムを編集し、diff を見直し、コミットする。PartiQL の INSERT/UPDATE/DELETE もステージされ、変更を Commit / 変更をステージ のスプリットボタンが付く。⌘⌫ は削除をステージし、 ⌘⇧⌫ は選択範囲を直接削除する。

テーブルの概要には DynamoDB のアイテム数とサイズの見積もりが表示されるので、移行前に成長が見える。

どのキーがホットかを見るには、AWS コンソールの CloudWatch Contributor Insights を使う。料金計算機 は、移行がデュアルライトしているあいだの追加の書き込みをモデル化する。

無料の読み取り専用プランはクエリとエクスポートをカバーする。ステージングとコミットには有効なライセンスまたはトライアルが必要。DynoTable をダウンロードして、クレジットカード不要の 30 日間無料トライアルを始め、自分のテーブルに対して書き込みをステージしよう。