【正解】A、C
【0からの解説】
レスポンス中の ErrorCode が ProvisionedThroughputExceededException で「Rate exceeded for shard ...(シャードのレート超過)」と出ています。これは、特定シャードの書き込みスループット上限(1 シャードあたり 1,000 レコード/秒、または 1 MB/秒)を超えたことを意味します。
対処の定石は 2 つです。1 つ目は「指数バックオフ付きリトライ (A)」。一時的なスロットリングに対し、待ち時間を指数的に伸ばしながら失敗したレコードだけ再送することで、輻輳を悪化させずに成功率を高めます。PutRecords は部分的失敗を返すため、FailedRecordCount と各レコードの ErrorCode を見て失敗分のみ再送するのが正しい実装です。2 つ目は「リクエストの頻度・サイズの削減 (C)」。送信ペースやバッチサイズを抑えることで、シャードのレート上限超過そのものを回避します(あわせてシャード分割やパーティションキー分散も有効)。
【誤りの選択肢】
B:PutRecord(単一レコード)に変えてもシャードあたりのスループット上限は同じであり、むしろ 1 回あたりの効率が落ちるため、スロットリングの根本対策になりません。
D:Amazon SNS はパブリッシュ/サブスクライブ型メッセージングで、Kinesis のようなシャード単位のストリーム処理・順序保証・再処理とは用途が異なり、スロットリングの解決策として的外れです。
E:KCL コンシューマーは「読み取り側」です。今回のエラーは「書き込み (PutRecords)」のスループット超過なので、コンシューマー数を減らしても書き込みスロットリングは緩和されません。
【参考】
Kinesis Data Streams の制限とエラー再試行API リクエストのエラー再試行と指数バックオフ