Слишком много записей GetRecords по сравнению с PutRecords в Kinesis Stream, что приводит к дублированию записей - PullRequest
0 голосов
/ 28 мая 2020

У меня есть поток Kinesis с тремя осколками, и приложения Producer записывают в поток случайный ключ раздела. В Kinesis Metri c я обнаружил, что количество GetRecords.Records почти вдвое больше, чем количество PutRecords.Records.

Если быть точным, подсчет (в минуту):

PutRecords.Records: 10749

GetRecords.Records: 21496

Из-за этого процессор записи Kinesis, который в моем случае является лямбда-выражением, получает много повторяющихся записей.

AWS документ действительно предполагает, что будет некоторые дублируются механизмом доставки «хотя бы один раз» потока Kinesis. Но почти двойник GetRecords не очень подходит. Вот мой шаблон SAM для лямбда-выражения процессора.

  MyStream:
  Type: AWS::Kinesis::Stream
  Properties:
    Name: my-stream
    ShardCount: 3

  MyStreamProcessorLambda:
   Type: AWS::Serverless::Function
   Properties:
    FunctionName: my-stream-processor-lambda
   ...
   ...
   Events:
    Stream:
      Type: Kinesis
      Properties:
        Stream: !Ref MyStream
        BatchSize: 10000
        StartingPosition: LATEST
        MaximumBatchingWindowInSeconds: 300

Лямбда-выражение процессора теперь идемпотентно за счет принудительного ограничения БД, так что одна и та же запись из пакета никогда не будет вставлена ​​в БД. Также коэффициент ошибок лямбда равен 0. ( Нет ошибок / повторных попыток лямбда )

Также GetRecords.IteratorAgeMilliseconds в метриках потока равно 0 и Превышение пропускной способности чтения / записи равно 0.

Таким образом, я бы вы хотите избавиться от этих повторяющихся записей в пакете, лямбда обрабатывается.

Любая конфигурация здесь пошла не так?

1 Ответ

0 голосов
/ 29 мая 2020

Похоже, что в расширенном потребителе разветвления Kinesis SubscribeToShard также получает все записи из вызова GetRecords . По этой причине количество GetRecords почти вдвое больше, чем PutRecords .

...