2016-05-10 1 views
0

Мое приложение читает поток dynamoDB искать изменения в таблицу, и я в настоящее время получаю самый последний поток, как это:Динамо DB потоки, обновить последний поток ARN

this.awsDB.describeTable({TableName: 'MatchDraft'}, function(err, data){ 
    if(err){ 
    console.log(err); 
    } else { 
    this.streamArn = data.Table.LatestStreamArn; 
    console.log(data, this.streamArn); 
    _readStream.apply(this); 
    } 
}.bind(this)); 

Проблема Я бегу в что таблицы LatestStreamArn не обновляются самостоятельно и заканчиваются каждые 24 часа, после чего моя программа начинает работать. Я ВСЕГДА использую только тип итератора «LATEST» shard, поэтому я не хочу сохранять 24-часовую запись всех изменений, я просто хочу использовать итераторы осколков, чтобы эффективно находить изменения в таблице и отображать их, поскольку они происходят.

Как я могу сделать свое приложение автоматически, просто создав новый LastStreamArn по мере необходимости самым эффективным способом? Код - все клиентские стороны в веб-браузере пользователей, поэтому я не хочу открывать разрешения для API UpdateTable, который, насколько я знаю, является единственным способом обновления потока.

+0

Почему вы не используете AWS Lambda? –

+0

@EyalCh Я думаю, потому что в стороне от этой одной проблемы, которая кажется, как будто это должно быть тривиально, я не нуждаюсь в этом. Как конкретно было бы полезно? Кажется, что теперь мне просто нужно хроновое задание, которое вызывает таблицу обновлений каждые 24 часа, и другого решения нет. У лямбды был бы более чистый способ решить эту проблему? Что конкретно вы бы с ним сделали? – asutherland

+0

@Eyal Ch Если бы лямбда помогла бы мне, мне определенно хотелось бы знать, как это сделать. Даже если вы разрешаете вызов UpdateTable, мой поток, похоже, больше не будет активен через определенное время.Единственный способ заставить мое приложение возобновить работу - отключить поток через updateTable и снова включить его: / – asutherland

ответ

2

The LastStreamArn не истекает через 24 часа. Поток создается, когда вы включаете потоки DynamoDB или через вызов API CreateTable или UpdateTable.

lastStreamArn изменится, если вы отключите поток DynamoDB, а затем снова включите его.

Вызов GetShardIterator с ShardIteratorType LATEST может привести к потере данных, потому что нет гарантии, что последний ответ GetRecords включил все записи до этой точки.

Для того, чтобы отслеживать изменения от DynamoDB потоков, нужно сделать несколько вещей, на практике:

  1. Включить поток - вам нужно только позвонить DescribeTable сразу же после этого, чтобы получить latestStreamArn (приложение может вызвать это один раз при запуске).

  2. Периодически вызывать ОписыватьСтрит, чтобы получить список осколков. Используя указатели parentShardId в каждом осколке, вы можете построить линию черепа. Если вы хотите обработать изменения в порядке, вы должны полностью обработать осколок перед обработкой любого из его потомков.

  3. Вызов GetShardIterator один раз при запуске осколка. Вы можете использовать тип итератора типа TRIM_HORIZON, если хотите обработать все события. В противном случае вы можете инициализировать свое приложение, обработав последние осколки (последнее поколение в линейке) и начинать с типа Итератора LATEST. Однако, если вы хотите обрабатывать записи по порядку, все будущие осколки, которые вы обрабатываете, должны быть инициализированы в TRIM_HORIZON.

  4. Звоните GetRecords повторно, чтобы разбивать страницы на черепицу. Каждый результат GetRecords включает следующую следующую команду для следующей страницы результатов. Вместо того, чтобы вызывать GetShardIterator в любое время, когда вы хотите обработать определенный осколок, вам нужно только позвонить ему один раз, чтобы получить действительный итератор шара, - тогда вы можете просто продолжить вызов GetRecords, пока не достигнете конца осколка (nextShardIterator - null) ,