Контекст: я не обязательно имею в виду приложение на основе KCL, это просто вызовы API Kinesis.
Предоставляет ли итератор TRIM_HORIZON
тип итератора сразу самой ранней опубликованной записи в потоке (т. Е. Самой ранней из доступных во встроенном 24-часовом окне Kinesis) или просто итератора / курсора для некоторого периода времени, равного 24 часам назад, что вы должны затем использовать для продвижения по потоку, пока не достигнете самой ранней опубликованной записи?
Другими словами, если это не совсем понятно ....
При использовании типа итератора осколка TRIM_HORIZON
, ожидаемое поведение начнется с возврата записей, которые были доступны 24 часа назад, НО если ноль записей было опубликовано ровно 24 часа назад, а вместо этого всего 3 часа назад, ваше приложение будет нужно итеративно опрашивать предыдущий 21 час, прежде чем он достигнет записей, опубликованных 3 часа назад?
Пример временной шкалы:
- 29 сентября, 5:00 - создание потока "foo" с 1 осколком.
- 29 сентября, 5:02 - публикация отдельной записи «Item = A» в потоке «foo».
- 29 сентября, 5:03. Выполните вызов
GetShardIterator
сTRIM_HORIZON
в качестве типа итератора сегмента, затем выполните вызовGetRecords
с этим итератором сегмента и получите запись «Item = A» - 30 сентября, 7:02 - публикация второй записи «Item = B» в потоке «foo».
- 30 сентября, 7:03. Выполните вызов
GetShardIterator
сTRIM_HORIZON
в качестве типа итератора осколка, затем выполните вызовGetRecords
с этим итератором осколка. Чего следует ожидать в результате этого вызова? (Примечание: мы не запомнили / не использовали итератор сегментов из шага 3)
Для шага 5, описанного выше, прошло более 24 часов с момента публикации сообщения «Item = A» в потоке и только минута с момента публикации «Item = B». Будет ли новый итератор сегментов с TRIM_HORIZON
немедленно предоставить вам самую раннюю доступную запись, или вам нужно будет продолжать итерацию до тех пор, пока не наступит период времени, когда что-то было опубликовано?
Я экспериментировал с Kinesis, и вчера или два дня назад все работало нормально (т. Е. Я публиковал и потреблял без каких-либо проблем). Я внес некоторые дополнительные изменения в свой код и сегодня снова начал публикацию. Когда я запустил своего потребителя, ничего не выходило даже после того, как он поработал несколько минут. Я пробовал публиковать и использовать в одно и то же время, но все равно ничего. После ручной игры с типом итератора AFTER_SEQUENCE_NUMBER
и использования некоторых порядковых номеров из моих журналов потребителей, сделанных несколько дней назад, я смог добраться до моих недавно опубликованных сообщений. Но затем, если я вернусь к использованию типа TRIM_HORIZON
, я не вижу вообще никаких сообщений.
Я просмотрел документы, но большинство найденных мной документов Предположим, вы используете KCL (на самом деле я изначально использовал KCL, но когда он начал давать сбои, я перешел к необработанным вызовам API) и упомянул, что у вас должно быть имя приложения и что таблицы DynamoDB используются для отслеживания состояния. Что, насколько я могу судить, неверно, если вы используете чистые вызовы Kinesis API или Kinesis CLI, которые я в конце концов попробовал. В конце концов, я написал чистый API-скрипт, чтобы начать с TRIM_HORIZON
и бесконечно опрашивать, и в конце концов он достиг новых рекордов (потребовалось ~ 600 итераций; началось на 14 часов позже «сейчас», а записи были обнаружены примерно на 5 часов позже «сейчас»). Если это ожидаемое поведение, похоже, что формулировка в документации просто немного сбивает с толку / вводит в заблуждение:
TRIM_HORIZON - начать чтение с последней необрезанной записи в шарде в системе, которая является самой старой записью данных в шарде.
Я предположил (теперь это кажется неверным), что термин «самая старая запись данных» означает запись, которую я опубликовал в потоке, а не просто период времени в потоке.
Было бы здорово, если бы кто-нибудь мог помочь подтвердить / объяснить поведение, которое я наблюдаю.
Спасибо!