DynamoDB Streams: ExpiredIteratorException

TL;DR — GetShardIterator'dan gelen bir parça yineleyicisi yalnızca 15 dakika geçerlidir. Tüketiciniz duraklattıysa, bir toplu işi yavaş işlediyse ya da bir yeniden başlatma boyunca bir yineleyici tuttuysa, bir sonraki GetRecords çağrısı bunu fırlatır. Yeni bir yineleyici isteyerek kurtarın — kaldığınız yerden tam olarak devam etmek için işlediğiniz son sıra numarasıyla AFTER_SEQUENCE_NUMBER kullanın.

Ne anlama gelir

ExpiredIteratorException: The provided iterator exceeds the maximum age allowed.

Bir DynamoDB akışını doğrudan okumak iki adımlı bir döngüdür: GetShardIterator size bir parçaya konum tutamacı verir ve her GetRecords çağrısı onu tüketir ve bir sonrakini döndürür (NextShardIterator). Bu tutamaçların her biri, verildikten 15 dakika sonra sona erer. İstisna, verinin gittiği anlamına gelmez — akış kayıtları 24 saat yaşar — yalnızca bu konum tutamacının bayat olduğu ve yeni bir tanesine ihtiyacınız olduğu anlamına gelir.

Neden olur

  • Yoklamalar arasında yavaş işleme — toplu iş başına yapılan iş (yazmalar, dış çağrılar), bir sonraki GetRecords'tan önce 15 dakikadan uzun sürer.
  • Duraklatılmış veya askıya alınmış bir tüketici — durdurulmuş bir işçi, uzun bir dağıtım ya da döngüyü tutan bir hata ayıklayıcı oturumu.
  • Yineleyicileri depolamak — yineleyici dizesini (bir DB'de veya kontrol noktasında) kalıcı kılmak ve sonra yeniden kullanmak; yineleyiciler geçicidir, sıra numaraları değildir.
  • Geri çekilme uzadı — pencereyi geçerek uyuyan bir hata-yeniden deneme döngüsü.

Nasıl düzeltilir

  1. Onu yakalayın ve yineleyiciyi son kontrol noktanızdan yeniden tohumlayın — işlediğiniz son kaydın SequenceNumber'ını izleyin, sonra:

    const {ShardIterator} = await streams.send(
      new GetShardIteratorCommand({
        StreamArn: streamArn,
        ShardId: shardId,
        ShardIteratorType: 'AFTER_SEQUENCE_NUMBER',
        SequenceNumber: lastProcessedSequenceNumber
      })
    );

    Henüz kontrol noktası yok mu? TRIM_HORIZON parçayı en eski mevcut kayıttan yeniden işler; LATEST yeni etkinliğe atlar.

  2. Yineleyicileri değil, sıra numaralarını kontrol noktalayın — sıra numarası kalıcı devam noktasıdır.

  3. Yoklama döngüsünü sıkı tutun — ağır kayıt başına işi eşzamansız yapın (kuyruğa alın), böylece GetRecords temposu 15 dakikanın rahatça içinde kalsın.

  4. Yönetilen tüketicileri tercih edin — Lambda olay kaynağı eşlemeleri ve DynamoDB Streams Kinesis Adapter (KCL) yineleyicileri ve kontrol noktalarını sizin için yönetir; elle yazılmış GetRecords döngüleri bu istisnanın yaşadığı yerdir.

Ele alışınızın idempotent olduğundan emin olun: bir kontrol noktasından devam etmek, yarı işlediğiniz bir kaydı yeniden teslim edebilir. Akışın kendisi her kaydı tam olarak bir kez içerir, ancak son kontrol noktasından yeniden tohumlayan bir tüketici fiilen en-az-bir-kez işler.

Bir akışın gerçekte ne yaydığını ayıklamak, öğelerin değiştiğini görebildiğinizde çok daha kolaydır — DynoTable masaüstü uygulaması bir öğenin canlı durumunu gösterir, böylece akış kayıtlarını veriyle eşleştirebilirsiniz. Yetişme yeniden oynatmasının okuma maliyetini mi tahmin ediyorsunuz? DynamoDB fiyatlandırma hesaplayıcısı yanınızda.

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