弱网环境下用户上传一次,桶里出现 a.jpg、a_1.jpg、a_2.jpg 三份。客户端超时时间是 30 秒,实际三次请求都到了服务端。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
aws s3api head-object --bucket b --key a.jpg aws s3api list-objects-v2 --bucket b --prefix a --query "Contents[].Key"
客户端超时只是本地放弃等待,请求可能已经在服务端完成。重试又换了新文件名,服务端无法判断是同一份文件。没有幂等键时,重复请求只能各存一份。这一点先确认清楚,后面就不用反复试。
「上传重试重复」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,上传前生成请求 id 作为 key 的一部分 重试复用同一个;服务端按 key 覆盖写入 天然幂等;客户端超时后先查对象是否存在 再决定重试;清理已产生的重复文件 用哈希比对。
改完照着核一遍,弱网重试三次后桶里只有一个 key,内容哈希与本地文件一致。
