You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Kinesis生产者调用putRecordsRequest批量写入时重复发送记录问题

解决AWS Kinesis批量写入后记录重复的问题

遇到过不少朋友碰到这种情况:调用putRecords写入批量数据,接口返回成功,但消费时发现每条记录都被重复发送——就像你贴出来的那样,相同的partitionKey和data,却有不同的sequenceNumber。咱们一步步来排查和解决:

最常见的原因:客户端重复发起了写入请求

Kinesis的putRecords接口本身不默认提供幂等性,如果你的客户端因为逻辑错误(比如重试机制没写对)或者网络波动误判,重复发送了同一个批量请求,Kinesis就会把这些重复请求都写入流里,导致你看到重复记录。

排查步骤:

  • 先检查putRecords的响应结果:每个PutRecordsResultEntry里的ErrorCode如果都是空的,说明第一次写入已经完全成功。这时候出现重复,大概率是客户端又发了一次相同的请求。
  • 在客户端加日志,记录每次调用putRecords的请求时间、请求内容的哈希值(比如对整个putRecordsRequestEntryList做哈希),以及AWS返回的ResponseMetadata里的请求ID。对比重复记录对应的请求日志,就能确认是不是重复调用了。
  • 检查代码里的重试逻辑:是不是把“写入成功”的情况当成了失败来重试?比如错误地判断了响应状态,或者重试触发器没做好。

用幂等写入彻底解决重复问题

AWS Kinesis支持通过ClientRequestToken参数实现幂等写入——给每个批量请求分配一个唯一的token(比如UUID),24小时内重复的相同token请求会被Kinesis自动忽略,不会重复写入。

代码示例(以Java SDK为例):

import java.util.UUID;
import software.amazon.awssdk.services.kinesis.model.PutRecordsRequest;

// 构建批量写入请求
PutRecordsRequest putRecordsRequest = PutRecordsRequest.builder()
        .streamName("your-stream-name")
        .records(putRecordsRequestEntryList) // 你的批量记录列表
        .clientRequestToken(UUID.randomUUID().toString()) // 添加唯一幂等token
        .build();

// 发送请求
kinesisClient.putRecords(putRecordsRequest);

其他语言的SDK也类似,只要在PutRecordsRequest里设置对应的ClientRequestToken参数即可。

其他可能的排查点

  • 检查SDK的重试配置:AWS SDK默认只会在请求失败(比如5xx错误、连接超时)时重试,但如果你的SDK重试策略被修改过(比如错误地把2xx响应也当成重试触发条件),也可能导致重复写入。可以核对一下SDK的重试规则配置。
  • 确认不是消费端问题:如果两条记录的sequenceNumber相同,那可能是消费端没做好checkpoint,导致重复读取。但你例子里的sequenceNumber是不同的,所以可以排除这种情况。

内容的提问来源于stack exchange,提问作者user2392631

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:43:19