我让Lambda订阅了SNS主题并将并发限制设置为5。
一旦推送了20条SNS消息,Lambda将运行5个实例并处理前5条SNS消息,这是完全正常的。根据文档,其他消息将被视为限制并发送重试。 再次看起来像预期的行为。
在这个阶段,我有5个lambda实例的CloudWatch日志,每个实例处理1条消息。还好。
一旦重试时间到来,我看到这5个实例进一步处理另一个消息,但是现在5个lambda实例中的每一个都有大约8个已处理的消息(应该有大约4个实例,导致5个实例共处理20个消息)。实例处理了一些重试的消息两次,成功的时间和不同的请求ID。
似乎有时SNS消息可以被传递两次,但是根据上面的数字,看起来几乎每条消息都被传递和处理两次。
这些可以以某种方式避免吗?
Lambda并发性仅限于5,因为如果我推送500条消息,它将触发500个实例,并在lambda创建连接时关闭我的RDS。
再次提问 - 如果第一次处理成功结束,为什么重试的消息会被处理两次。检测重复项也很难,因为每次都会由不同的实例处理
答案 0 :(得分:4)
这是一个众所周知的观察(它是否是一个值得商榷的问题)https://forums.aws.amazon.com/thread.jspa?threadID=252415&tstart=0
我注意到这种情况在两个月前开始发生。 AWS上面的支持论坛主题不够活跃,无法获得AWS'不幸的是。
来自SNS FAQs:
问:订阅者收到每封邮件的次数是多少次?
虽然大多数情况下每封邮件只会传递给您的应用程序一次,但Amazon SNS的分布式特性和瞬态网络状况可能会在订阅者端产生偶然的重复消息。开发人员应该设计他们的应用程序,以便不止一次地处理消息不会产生任何错误或不一致。
最后,AWS不保证永远不会重复,因此我们必须围绕该设计设计应用程序。
在我的应用程序中,我切换到写入DynamoDB表并使用DynamoDB Stream来触发Lambda而不是发布到Lambda侦听的SNS主题。