SNS 调用的 AWS lambda 受到限制,发送以重试并在之后多次成功调用
SNS invoked AWS lambda is throttled, sent to retry and invoked successfully more then once later
我让 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。
所以再次提问 - 如果第一次处理成功结束,为什么重试消息会处理两次。检测重复项也很困难,因为它们每次都由不同的实例处理
这是一个已知的观察(是否是问题是 debatable)https://forums.aws.amazon.com/thread.jspa?threadID=252415&tstart=0
我注意到这种情况大约在两个月前开始发生。不幸的是,上述关于 AWS 的支持论坛主题不够活跃,无法引起 AWS 的注意。
来自SNS FAQs:
Q: How many times will a subscriber receive each message?
Although most of the time each message will be delivered to your application exactly once, the distributed nature of Amazon SNS and transient network conditions could result in occasional, duplicate messages at the subscriber end. Developers should design their applications such that processing a message more than once does not create any errors or inconsistencies.
最后,AWS 不保证永远不会重复,因此我们必须围绕这一点设计我们的应用程序。
在我的应用程序中,我切换到写入 DynamoDB table 并使用 DynamoDB Stream 触发 Lambda,而不是发布到 Lambda 侦听的 SNS 主题。
我让 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。
所以再次提问 - 如果第一次处理成功结束,为什么重试消息会处理两次。检测重复项也很困难,因为它们每次都由不同的实例处理
这是一个已知的观察(是否是问题是 debatable)https://forums.aws.amazon.com/thread.jspa?threadID=252415&tstart=0
我注意到这种情况大约在两个月前开始发生。不幸的是,上述关于 AWS 的支持论坛主题不够活跃,无法引起 AWS 的注意。
来自SNS FAQs:
Q: How many times will a subscriber receive each message?
Although most of the time each message will be delivered to your application exactly once, the distributed nature of Amazon SNS and transient network conditions could result in occasional, duplicate messages at the subscriber end. Developers should design their applications such that processing a message more than once does not create any errors or inconsistencies.
最后,AWS 不保证永远不会重复,因此我们必须围绕这一点设计我们的应用程序。
在我的应用程序中,我切换到写入 DynamoDB table 并使用 DynamoDB Stream 触发 Lambda,而不是发布到 Lambda 侦听的 SNS 主题。