与 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.IteratorAgeMilliseconds 是 0 和 Read/Write ThroughputExceeded 是 0.
因此,我想摆脱批处理中的那些重复记录,lambda 正在处理。
这里有什么配置出错了吗?
似乎在 Kinesis 增强型扇出消费者中,SubscribeToShard 也从 GetRecords 调用中获取所有记录。这就是 GetRecords 计数几乎是 PutRecords.
计数两倍的原因
我有一个包含三个分片的 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.IteratorAgeMilliseconds 是 0 和 Read/Write ThroughputExceeded 是 0.
因此,我想摆脱批处理中的那些重复记录,lambda 正在处理。
这里有什么配置出错了吗?
似乎在 Kinesis 增强型扇出消费者中,SubscribeToShard 也从 GetRecords 调用中获取所有记录。这就是 GetRecords 计数几乎是 PutRecords.
计数两倍的原因