【发布时间】:2020-10-24 11:59:28
【问题描述】:
背景
此架构仅依赖于 Lambda 的异步调用机制,如下所述:
https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html
我有一个收集器函数,它每分钟调用一次并获取一批数据,这些数据的大小可能会有很大差异(几十 KB 到可能 1-3MB)。数据包含一个 JSON 数组,其中包含一对多记录。收集器功能将这些记录隔离并单独发布到 SNS 主题。
解析器函数是 SNS 主题的子类,并发限制为 3。SNS 异步调用每条记录的解析器函数,这意味着随着解析器实例的最大值,内置 AWS 托管 Lambda 异步队列开始填满在 3 点结束。当发生限制时,Lambda 排队机制会在增量备份时启动重试,直到解析器函数可以处理调用请求。
记录在此过程中不会丢失,因为它们无法复活,这是必不可少的。我将在需要的地方使用死信队列,以确保它们最终在出现错误的情况下结束。
测试此方法不会导致调用丢失。一切都按预期工作。 Lambda 报告了数百个节流响应,但我依靠它来启动异步调用的 Lambda 重试行为。我的理解是,如果我想重试使用来自 SQS 的消息,这种行为实际上与我必须自己开发和启动的行为相同。
问题
1.内置的 AWS 托管的 Lambda 异步队列可靠吗?
解析器可能会在很长一段时间内承受每分钟 200 多次调用的一致负载,因此我想了解 Lambda 队列是否可以像 SQS 服务一样明智地处理这个问题。我关心的主要部分是这样的声明:
即使您的函数没有返回错误,它也有可能多次从 Lambda 接收相同的事件,因为队列本身最终是一致的。如果函数无法跟上传入事件,则事件也可能会从队列中删除而不发送到函数。确保您的函数代码优雅地处理重复事件,并且您有足够的并发性来处理所有调用。
这意味着传入的调用可能只是凭空删除。同样在我的实现中,我依赖于函数限制时的重试行为。
2。当消息在队列中时,超过消息超时会发生什么?
我找不到明确的答案,但我希望消息最终会出现在配置的死信队列中。
3。当 SQS 出现其他问题时,为什么我要在 Lambda 队列上使用 SQS?
有关反对 SQS 的论据,请参阅以下文章。过度拉动(在第二个链接中描述)特别值得关注:
https://lumigo.io/blog/sqs-and-lambda-the-missing-guide-on-failure-modes/
我找不到任何关于 Lambda 队列如何执行的文章或讨论。
感谢阅读!
【问题讨论】:
标签: amazon-web-services aws-lambda amazon-sqs amazon-sns