DEA / ドメイン1 データの取り込みと変換

スロットリングとレート制限

は、サービスが受け付けられる量を超えたリクエストを拒否したり遅らせたりすることです。データパイプラインは大量の読み書きを短時間に行うため、、、、外部 などの上限にぶつかりやすく、そのままではデータの取りこぼしやジョブの失敗につながります。この章では、上限の種類と、上限を守りながら処理を進める設計を整理します。

Point
  • Throttling は「絞ること」です。車のアクセル (スロットル) を絞るイメージです。
  • Rate limit (レート制限) は、単位時間あたりの回数の上限です。
  • 指数バックオフ (exponential backoff) は、失敗するたびに待ち時間を倍々に延ばして再試行する方法、ジッター (jitter) は待ち時間にランダムなゆらぎを加えることです。
  • 和訳

概要

概要の図 成功 スロットリング 大量の書き込み SQS などのバッファ ワーカー同時実行数を制限 DynamoDB・RDS・Kinesis・外部 API 指数バックオフ+ ジッターで再試行
サービス主な上限の表れ方
テーブルの容量 (プロビジョンド)、パーティションごとの上限ProvisionedThroughputExceededException、ThrottlingException
/同時接続数 (max_connections)、・I/O接続エラー (too many connections)、応答の遅れ
あたりの書き込み・読み取りProvisionedThroughputExceededException
数 (既定であたり 1,000)429 TooManyRequestsException
アカウントで毎秒 10,000 リクエスト (バースト 5,000) が既定429 Too Many Requests
外部の 提供元が決める回数の上限429、待つべき秒数を示すヘッダー

対処の基本は4つです。上限を上げる、負荷を均す、再試行を正しく行う、集中を分散する、です。


主要技術

①DynamoDB のスロットリング ⚠️ 頻出

原因対処
テーブル全体の容量が足りない (プロビジョンド)、容量の引き上げ、モードへの切り替え
特定のに集中 (ホットキー)分散するキーの設計、書き込みシャーディング (キーに接尾辞を付けて分散)
の容量不足GSI の書き込み容量が足りないと、ベーステーブルへの書き込みもされる。GSI の容量を引き上げる
一度に大量のロード書き込み速度を制御する。BatchWriteItem の UnprocessedItems をバックオフして再送

1つのパーティションが処理できるのは、毎秒 3,000 読み込みキャパシティユニットと 1,000 書き込みキャパシティユニットまでです。テーブル全体の容量に余裕があっても、1つのキーに集中すると、このパーティションの上限でスロットリングされます。 の適応型キャパシティは、よく使われるパーティションに容量を寄せますが、パーティションの上限そのものは超えられません。

容量モード向くケース
オンデマンド流量が読めない、急に増える、容量の管理をしたくない
プロビジョンド + Auto Scaling流量がおおむね予測でき、コストを抑えたい

⚠️ 頻出: 「テーブル全体の容量は余っているのにスロットリングされる」は、ホットキー (パーティションの上限) か GSI の容量不足です。容量を上げる前にキーの設計と GSI を確かめます。


②RDS の接続数と RDS Proxy ⚠️ 頻出

のように多数の実行環境が同時に DB へ接続すると、 の最大接続数に達し、新しい接続が拒否されます。

対処内容
RDS Proxyアプリケーションと DB の間で接続をプールし、多数のクライアントの接続を少数の DB 接続にまとめる。の時間も短くする
Lambda の数の制限予約同時実行数で、DB へ向かう関数の同時実行の上限を決める
接続の再利用関数のハンドラーの外で接続を作り、呼び出しをまたいで使い回す
読み取りの分散分析やエクスポートの読み取りをへ向ける

⚠️ 頻出: 「Lambda から RDS へ接続すると、負荷が高いときに接続数の上限エラーが出る」は RDS Proxy です。


③Kinesis の書き込み上限

のは毎秒 1 MB または 1,000 レコードまで書き込めます。上限を超えると ProvisionedThroughputExceededException が返ります。シャードの追加、モード、の分散、KPL による集約、付きの再送で対処します (「Amazon Kinesis Data Streams」の章)。


④指数バックオフとジッター ⚠️ 頻出

されたリクエストを、すぐに同じ間隔で再送すると、全クライアントが一斉に再送して再びスロットリングされます。

方法内容
1回目は短く、失敗のたびに待ち時間を倍にする (例: 100 ms、200 ms、400 ms …)。上限の待ち時間と最大の再試行回数を決める
ジッター待ち時間にランダムなゆらぎを加え、多数のクライアントの再送の時刻をずらす
の再試行AWS SDK はスロットリングのエラーを自動で再試行する。再試行モード (standard、adaptive) と最大回数を設定できる
再送しても結果が変わらないよう、一意のキーやクライアントトークンを使う
④指数バックオフとジッター ⚠️ 頻出の図 はい スロットリング まだ 超えた リクエスト 成功? 完了 再試行の上限? 待つ: 基本時間 × 2^n+ ランダムなゆらぎ DLQ へ退避・アラーム

再試行してはいけないエラーもあります。権限の不足や不正なリクエスト (多くの 4xx) は、何度送っても失敗します。再試行するのは、スロットリングと一時的なサーバーエラー (5xx) です。


⑤バッファリングで負荷を均す

書き込み先の上限より速くデータが届く場合は、キューやストリームでいったん受け止めて、書き込み先が受け付けられる速さで流します。

手段内容
+ SQS にためて、Lambda のイベントソースマッピングの最大数で書き込みの速さを抑える
ストリームにためて、コンシューマーのペースで読む
バッファしてまとめて配信する
の分散マップ並列数 (MaxConcurrency) を指定して大量の項目を処理する

⑥API のレート制限を越える設計

外部 や AWS の API から大量のデータを取り込むときの考え方です。

手段内容
ページング1回で全部を取らず、ページ単位で取得する。次のページのトークンを使う
バッチ API1件ずつではなくまとめて取得・登録する API を使う
呼び出しの速度の制御トークンなどで毎秒の呼び出し回数を上限以下に保つ
増分の取得変更分だけを取る (更新日時のフィルター)
同じデータを何度も取らない
上限の引き上げ で申請できる上限は引き上げる

自分で API を公開する側では、 のステージやメソッドの、使用量プランと API キーで、利用者ごとの上限を設定します。


試験対策

①判断マトリクス

問題文のキーワード選ぶ対処
の流量が読めずモード
容量は余っているのに一部だけスロットリングの分散 (ホットキーの解消)
の追加後にベーステーブルの書き込みが失敗GSI の書き込み容量を上げる
から の接続数が上限RDS Proxy
の書き込みでスロットリング追加・オンデマンド・バックオフ
再試行が一斉に起きて再びスロットリング + ジッター
書き込み先より速くデータが届く などでバッファし、数で速さを制御
外部 の回数上限を超えないように取り込むページング、速度の制御、増分の取得
自社の API の利用者ごとに上限 の使用量プラン

②よくある誤答

  • に対して、待たずにすぐ再送するループを書くこと。
  • ホットキーが原因なのに、テーブル全体の容量だけを上げること。
  • 権限エラーまで再試行すること。再試行するのは一時的なエラーだけです。
  • の数を増やせば DB への書き込みも速くなると考えること。DB の接続数の上限に先にぶつかります。

参考文献

  1. ※1出題比率: AWS 公式の試験ガイドに記載された、採点対象の設問のうちその分野が占める割合です。

検索

キーワードを入力してください