ant*_*yer 1 concurrency amazon-web-services amazon-sns aws-lambda
我让 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。
所以再次提问 - 如果第一次处理成功结束,为什么重试消息会被处理两次。检测重复也很困难,因为它们每次都由不同的实例处理
这是一个已知的观察(是否是一个问题值得商榷)https://forums.aws.amazon.com/thread.jspa?threadID=252415&tstart=0
我注意到这大约在两个月前开始发生。不幸的是,AWS 上的上述支持论坛主题不够活跃,无法引起 AWS 的注意。
来自SNS 常见问题解答:
问:订阅者将收到每条消息多少次?
尽管大多数情况下,每条消息只会传送到您的应用程序一次,但 Amazon SNS 的分布式特性和瞬态网络条件可能会导致订阅者端偶尔出现重复的消息。开发人员应该设计他们的应用程序,以便多次处理消息不会产生任何错误或不一致。
最后,AWS 不保证永远不会有重复,因此我们必须围绕这一点设计我们的应用程序。
在我的应用程序中,我切换到写入 DynamoDB 表并使用 DynamoDB Stream 来触发 Lambda,而不是发布到 Lambda 侦听的 SNS 主题。
归档时间: |
|
查看次数: |
2599 次 |
最近记录: |