与 Kinesis Stream 中的 PutRecords 相比,GetRecords 计数太多,导致重复记录

Too many GetRecords count compared to PutRecords in Kinesis Stream resulting duplicate records

我有一个包含三个分片的 Kinesis Stream,生产者应用程序使用随机分区键写入流。在 Kinesis Metric 中,我发现 GetRecords.Records 的计数几乎是 PutRecords.Records 计数的两倍。

精确计算(一分钟内):

PutRecords.Records: 10749

GetRecords.Records: 21496

因此,在我的例子中是 lambda 的 Kinesis 记录处理器正在获取大量重复记录。

AWS 文档确实建议 “at least once” delivery mechanism of Kinesis stream. 会有一些重复,但几乎是 GetRecords 的两倍并不是很合适。这是我的处理器 lambda 的 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

处理器 lambda 现在是幂等的,它通过强制执行 DB 约束使得批处理中的相同记录永远不会插入到 DB 中。 Lambda 的错误率也是 0。(lambda 没有错误/重试

此外,流指标中的 GetRecords.IteratorAgeMilliseconds0Read/Write ThroughputExceeded0.

因此,我想摆脱批处理中的那些重复记录,lambda 正在处理。

这里有什么配置出错了吗?

似乎在 Kinesis 增强型扇出消费者中,SubscribeToShard 也从 GetRecords 调用中获取所有记录。这就是 GetRecords 计数几乎是 PutRecords.

计数两倍的原因