AWS PHP SDK向SQS FIFO队列发多条消息仅收到1条问题求助
SQS FIFO队列循环投递仅收到1条消息的可能原因
- 消息去重规则触发
SQS FIFO队列默认有15分钟的去重窗口期,分为两种去重逻辑:如果队列开启了「基于内容的自动去重」,同一MessageGroupId下内容完全相同的消息会被判定为重复,仅保留第一条;如果没有开启自动去重,你需要手动为每条消息传入唯一的MessageDeduplicationId,如果多条消息传了相同的该参数,也会被去重。检查你的DispatchSQSJob封装方法,是否没有处理去重ID的生成逻辑,导致所有联系人消息的去重ID相同、或者消息内容完全一致触发了自动去重。 - 投递方法内部逻辑错误
检查DispatchSQSJob的内部实现:- 是否用了静态/全局变量存储消息体,循环调用时后续的联系人数据没有覆盖之前的内容,导致每次投递的都是第一条联系人的消息,触发去重
- 是否方法内部判断了重复调用的逻辑,相同
MessageGroupId仅投递一次 - 可以在方法调用SDK发送请求的位置加日志,确认实际发起的投递请求次数是否和联系人数组长度一致
- 批量投递接口使用错误
如果你封装的方法内部用了SendMessageBatch批量发送接口,需要确认是否每次方法调用都正确将当前消息加入待投递列表,且循环结束后没有遗漏提交最后一批消息,或者待投递列表没有每次重置,导致所有消息只有第一条被加入批量请求。 - 权限/限流拦截问题
检查AWS IAM权限是否有投递次数限制,或者SQS队列是否触发了限流阈值,后续请求被SDK自动重试时复用了相同的去重ID,导致被判定为重复请求。可查看AWS CloudWatch中对应SQS队列的NumberOfMessagesSent指标,确认服务端实际收到的消息数量。
内容的提问来源于stack exchange,提问作者Renaud
相关产品推荐
相关产品推荐

