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 SequenceNumber ile 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

  1. 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 LATEST kullanın.

  2. 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.

  3. Tüketici gecikmesinde uyarı verin — işlediğiniz kayıtların yaşını (ya da Lambda'nın IteratorAge metriğini) izleyin ve 24 saate yaklaşmadan çok önce çağrı yapın.

  4. 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

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.