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
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_HORIZONparçayı en eski mevcut kayıttan yeniden işler;LATESTyeni etkinliğe atlar.Yineleyicileri değil, sıra numaralarını kontrol noktalayın — sıra numarası kalıcı devam noktasıdır.
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
GetRecordstemposu 15 dakikanın rahatça içinde kalsın.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ış
GetRecordsdö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
- TrimmedDataAccessException — 24 saatlik saklama penceresinin gerisinde kaldınız (veri gerçekten gitti).
- Stream not enabled
- Invalid StreamArn
- Öğrenin: DynamoDB Streams
References
- GetShardIterator — Amazon DynamoDB Streams API Reference
- GetRecords — 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ı.