DynamoDB ProvisionedThroughputExceededException
TL;DR — Anda membaca/menulis lebih cepat daripada yang bisa dilayani tabel atau index. Alihkan tabel ke kapasitas on-demand, naikkan RCU/WCU provisioned (atau aktifkan auto-scaling), pertahankan percobaan ulang exponential-backoff bawaan SDK, dan sebarkan trafik supaya tidak ada satu partition key yang panas.
Apa artinya
ProvisionedThroughputExceededException: You exceeded your maximum allowed
provisioned throughput for a table or for one or more global secondary indexes.Pada tabel berkapasitas provisioned, Anda melampaui unit kapasitas baca/tulis — entah secara keseluruhan, atau (lebih sering) pada satu partisi. Ini HTTP 400 tetapi, tidak seperti ValidationException, ia bisa dicoba ulang: AWS SDK mencobanya ulang secara otomatis dengan exponential backoff, jadi kemunculan sesekali itu normal. Yang muncul terus-menerus berarti kapasitas memang kurang atau ada hot key. Error ini membawa field ThrottlingReason (misalnya TableReadProvisionedThroughputExceeded) plus ARN resource yang terdampak, sehingga Anda bisa tahu tabel atau index mana yang di-throttle dan pada jenis operasi apa.
Mengapa itu terjadi
- Kapasitas kurang untuk trafik yang sebenarnya.
- Hot partition — trafik terkonsentrasi pada satu partition key, sehingga jatah kapasitas satu partisi habis padahal tabelnya terlihat kurang terpakai secara keseluruhan.
- Trafik melonjak-lonjak lebih cepat daripada reaksi auto scaling — ia menyesuaikan kapasitas berdasarkan metrik consumed capacity, jadi perubahan mendadak akan di-throttle sebelum penambahan kapasitas mendarat.
- Scan besar atau impor massal yang menghabiskan seluruh kapasitas sekaligus.
- Sebuah GSI yang kapasitasnya lebih rendah daripada laju tulis — GSI yang di-throttle ikut men-throttle tabel dasarnya.
Bagaimana cara memperbaikinya
- Beralih ke kapasitas on-demand kalau trafiknya tak terduga — ia menskala otomatis dan error ini praktis lenyap (Anda membayar per request sebagai gantinya).
- Naikkan RCU/WCU provisioned atau aktifkan auto-scaling dengan target utilisasi yang masuk akal kalau Anda tetap di mode provisioned.
- Pertahankan percobaan ulang exponential-backoff — SDK melakukannya secara default; jangan dimatikan. Pakai mode retry adaptif untuk beban kerja yang meletup-letup.
- Bereskan hot partition-nya — tingkatkan kardinalitas key / lakukan write-sharding pada hot key supaya beban tersebar ke banyak partisi.
- Rem laju job massal dan cache pembacaan yang panas (DAX atau cache di aplikasi) untuk mengurangi tekanan baca.
FAQ
Bagaimana cara memperbaiki ProvisionedThroughputExceededException? Anda membaca atau menulis lebih cepat daripada yang bisa dilayani tabel atau index. Alihkan tabel ke kapasitas on-demand, naikkan RCU/WCU provisioned (atau aktifkan auto-scaling), pertahankan percobaan ulang exponential-backoff bawaan SDK, dan sebarkan trafik supaya tidak ada satu partition key yang panas.
Cara mereproduksinya
Sediakan tabel dengan 1 RCU, put satu item sedikit di bawah 4 KB, lalu baca kembali secara strongly-consistent dalam loop ketat:
import boto3
ddb = boto3.client('dynamodb', region_name='us-east-1')
# table created with ProvisionedThroughput={'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1}
ddb.put_item(TableName='my-table', Item={'pk': {'S': 'A'}, 'blob': {'S': 'x' * 3500}})
while True:
ddb.get_item(TableName='my-table', Key={'pk': {'S': 'A'}}, ConsistentRead=True)Keluaran sebenarnya:
ProvisionedThroughputExceededException: The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API.
HTTP 400Butuh 49 pembacaan untuk memicunya, pada tabel yang baru dibuat dengan percobaan ulang SDK dimatikan. Angka itulah bagian menariknya: tabel 1 RCU tidak gagal pada request kedua, karena DynamoDB meminjamkan kapasitas burst yang terakumulasi lebih dulu — jadi uji beban yang berhenti terlalu dini akan melaporkan sebuah tabel sehat padahal tidak. Separuh ilusi lainnya adalah SDK, yang secara default mencoba ulang request yang di-throttle untuk Anda; matikan percobaan ulang seperti di atas, atau error ini akan tetap tak terlihat sampai ia berubah jadi masalah latensi.
Kesalahan terkait
- ThrottlingException — batas laju di tingkat akun/control-plane.
- Throttled despite spare capacity (hot partition) — satu partition key menyerap seluruh trafik.
- On-demand throughput exceeded — padanannya di mode on-demand.
- ItemCollectionSizeLimitExceededException
- Contoh kode: BatchWriteItem di Node.js — pola percobaan ulang UnprocessedItems dengan backoff.
- Pelajari: On-demand vs provisioned · Hot partition
Referensi
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- Troubleshooting throttling in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Best practices for designing and using partition keys effectively in DynamoDB — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.
Direproduksi 2026-07-26 terhadap layanan DynamoDB live di us-east-1 via boto3 1.43.56, pada tabel yang diprovisioning di 1 RCU dengan percobaan ulang SDK dimatikan — keluaran di atas dikutip apa adanya.