書き込みと運用
DynamoDB が SQL のユニークインデックスのように一意性を強制すると想定し、条件式なしでデプロイし、本番で重複アカウントを発見する。属性横断の制約はなく、あるのは自分で設計するアトミックな書き込みだけだ。
書き込みはアイテム単位で、硬い上限付きでバッチされ、1 つの忙しいパーティションキーがスロットルしているあいだ、テーブルの残りは暇を持て余していることがある。
ALTER TABLE がないので、移行はアプリケーションレベルだ。このセクションはバッチ API、戻り値、カウンター、一意性パターン、オンラインの形変え、そしてホットパーティションを扱う。
このセクションで身につくこと
- 25 アイテム/16 MB の上限内で
BatchWriteItemとバッチ削除を、黙った部分失敗なしに使える。 - 条件付き書き込みでアトミックカウンターと複数属性の一意性を実装できる。
- デュアルライトまたはバックフィルパターンでゼロダウンタイム移行を計画できる。
- スロットリングの前に、書き込み分布とキー選択からホットパーティションを見つけられる。
読む順番
- バッチ操作:
BatchGetItemとBatchWriteItemの上限、未処理キー、バッチがトランザクションではない理由。 - 複数アイテムの削除:
BatchWriteItem、トランザクション、PartiQL とトランケート、そしてDELETE … WHEREがない理由。 - ReturnValues:
ALL_OLD、UPDATED_NEW、 2 回目の読み取りなしで何が返るか。 - アトミックカウンター:
ADD更新と、リトライしたインクリメントが二重に数えられる理由。 - 複数属性の一意性:一意性アイテムと重複を拒否する条件付き put。
- 移行:トラフィックが生きているあいだにキーと GSI を形変える。スキーマ移行ボタンはない。
- ホットパーティション:ホットキーの特定、書き込みシャーディング、ホットな読み取りのキャッシュ。
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 日間無料トライアルを始め、自分のテーブルに対して書き込みをステージしよう。