DynamoDB Streams: TrimmedDataAccessException
TL;DR — DynamoDB Streams kayıtları 24 saat tutar; daha eski kayıtlar budanır ve stream'den gider. Bu istisna, budanmış bir konumu istediğiniz anlamına gelir — bir günden eski bir kontrol noktası, genellikle kapalı olan ya da geride kalan bir tüketiciden. O kayıtları stream'den geri alamazsınız: TRIM_HORIZON'dan (hayatta kalan en eski kayıt) devam edin ve boşluğu tablonun kendisinden uzlaştırın.
Ne anlama gelir
TrimmedDataAccessException: The data you are trying to access has been trimmed.Yalnızca konum tutamacınızın bayatladığı bir süresi geçmiş yineleyicinin aksine, budanmış veri gerçekten kaldırılmıştır. Budanmış bir SequenceNumber'da bir parça yineleyicisi istemek ya da kayıtları yaşlanmış bir parçayı okumak bunu fırlatır. Stream, bir arşiv değil, kayan 24 saatlik bir tampondur.
Neden olur
- Tüketici 24 saatten fazla kapalıydı — bir kesinti, duraklatılmış bir işçi, unutulmuş devre dışı bir tetikleyici — ve kontrol noktası artık budanmış bölgeyi gösteriyor.
- İşleme gecikmesi saklamayı aştı — tüketici çalışıyor ama yazma hızından daha yavaş ve bir günden fazla geride kaydı.
- Bayat bir depolanmış kontrol noktası — haftalar önce kalıcı kılınmış bir
SequenceNumberile eski bir tüketiciyi yeniden başlatmak. - Eski bir parçayı baştan sona okumak — uzun ömürlü bir stream'in parça soyağacında dolaşmak ve saklamadan önceki aralıkları istemek.
Nasıl düzeltilir
En eski mevcut kayıttan devam edin ve boşluğu kabul edin:
const {ShardIterator} = await streams.send( new GetShardIteratorCommand({ StreamArn: streamArn, ShardId: shardId, ShardIteratorType: 'TRIM_HORIZON' // oldest untrimmed record }) );Yalnızca yeni etkinlik önemliyse bunun yerine
LATESTkullanın.Kaçırılan pencereyi doğruluk kaynağından uzlaştırın — tabloda hâlâ her öğenin mevcut durumu var. Etkilenen anahtarlar üzerinde sınırlı bir
Scan/Query(ya da büyük tablolar için bir dışa aktarma), ara sürümler eksik olmak üzere, budanmış kayıtların size söyleyeceğini yeniden oluşturur.Tüketici gecikmesinde uyarı verin — işlediğiniz kayıtların yaşını (ya da Lambda'nın
IteratorAgemetriğini) izleyin ve 24 saate yaklaşmadan çok önce çağrı yapın.Daha uzun saklamaya mı ihtiyacınız var? Kayıtlar geldikçe dayanıklı bir tampona akıtın (örneğin Kinesis adaptör desenleri aracılığıyla Kinesis Data Streams ya da işlenen kayıtları kendiniz kalıcı kılın) — DynamoDB Streams'in kendisi 24 saatin ötesine uzatılamaz.
Bir boşluktan sonra durumu yeniden oluşturmak, tabloda şu anda gerçekte neyin olduğuna bakmak demektir — DynoTable masaüstü uygulaması, o uzlaştırma geçişini bir betik değil, gözatılabilir bir sorgu yapar. Yetişme okumasını mı boyutlandırıyorsunuz? DynamoDB fiyatlandırma hesaplayıcısı, RCU maliyetini tahmin eder.
İlgili hatalar
- ExpiredIteratorException — kurtarılabilir kuzen: konum bayat, veri hâlâ orada.
- Stream not enabled
- Invalid StreamArn
- Öğrenin: 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
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.