DynamoDB Streams: TrimmedDataAccessException
TL;DR — DynamoDB Streams menyimpan rekaman selama 24 jam; rekaman lebih tua dipangkas dan hilang dari stream. Exception ini berarti Anda meminta posisi yang telah dipangkas — checkpoint lebih dari sehari, biasanya dari konsumen yang mati atau tertinggal. Anda tidak dapat mengembalikan rekaman itu dari stream: lanjutkan dari TRIM_HORIZON (rekaman tertua yang bertahan) dan rekonsiliasi celahnya dari tabel itu sendiri.
Apa artinya
TrimmedDataAccessException: The data you are trying to access has been trimmed.Berbeda dengan iterator kedaluwarsa — di mana hanya handle posisi Anda yang usang — data yang dipangkas benar-benar dihapus. Meminta shard iterator pada SequenceNumber yang dipangkas, atau membaca shard yang rekamannya telah menua keluar, melempar ini. Stream adalah buffer 24-jam bergulir, bukan arsip.
Mengapa terjadi
- Konsumen mati lebih dari 24 jam — pemadaman, worker yang dijeda, trigger yang dinonaktifkan terlupakan — dan checkpoint-nya sekarang menunjuk ke wilayah yang dipangkas.
- Keterlambatan pemrosesan melebihi retensi — konsumen berjalan, tetapi lebih lambat dari laju tulis, dan menyimpang lebih dari sehari.
- Checkpoint tersimpan usang — memulai ulang konsumen lama dengan
SequenceNumberyang dipersist minggu lalu. - Membaca shard lama dari ujung ke ujung — menelusuri garis keturunan shard dari stream berumur panjang dan meminta rentang yang mendahului retensi.
Cara memperbaikinya
Lanjutkan dari rekaman tertua yang tersedia dan terima celahnya:
const {ShardIterator} = await streams.send( new GetShardIteratorCommand({ StreamArn: streamArn, ShardId: shardId, ShardIteratorType: 'TRIM_HORIZON' // oldest untrimmed record }) );Gunakan
LATESTsebagai gantinya jika hanya aktivitas baru yang penting.Rekonsiliasi jendela yang terlewat dari sumber kebenaran — tabel masih punya keadaan saat ini dari setiap item.
Scan/Queryterbatas atas kunci yang terkena (atau ekspor untuk tabel besar) membangun kembali apa yang akan diberitahukan rekaman yang dipangkas, dikurangi versi perantara.Beri peringatan pada keterlambatan konsumen — pantau usia rekaman yang Anda proses (atau metrik
IteratorAgeLambda) dan panggil jauh sebelum mendekati 24 jam.Butuh retensi lebih lama? Streaming ke buffer tahan lama saat rekaman tiba (mis. Kinesis Data Streams via pola Kinesis adapter, atau persist rekaman yang diproses sendiri) — DynamoDB Streams sendiri tidak dapat diperpanjang melewati 24 jam.
Membangun kembali keadaan setelah celah berarti melihat apa yang sebenarnya ada di tabel sekarang — aplikasi desktop DynoTable membuat lintasan rekonsiliasi itu menjadi kueri yang dapat dijelajahi alih-alih skrip. Mengukur baca catch-up? Kalkulator harga DynamoDB memperkirakan biaya RCU.
Kesalahan terkait
- ExpiredIteratorException — sepupu yang dapat dipulihkan: posisi usang, data masih ada.
- Stream not enabled
- Invalid StreamArn
- Pelajari: DynamoDB Streams
References
- GetRecords — Amazon DynamoDB Streams API Reference
- GetShardIterator — Amazon DynamoDB Streams API Reference
- Change data capture for DynamoDB Streams — Amazon DynamoDB Developer Guide
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.