【问题标题】:SQS and Lambda: Limit max. amount of processed messagesSQS 和 Lambda:限制最大值。处理的消息量
【发布时间】:2019-11-25 17:01:23
【问题描述】:

如果使用 SQS 作为 Lambda 函数的事件源,有没有办法将“活动”消息的最大数量限制为 x。因此,假设有一个包含 1000 条消息的 SQS 队列,但我们不想尝试处理尽可能多的消息(最多默认并发限制 1000 条),我们只想同时处理最多 x 条消息。这显然意味着处理所有消息需要更多时间,但它会让我们有可能更好地控制例如写入数据库。

此外,如果无法处理消息(例如,由于 Lambda 函数中发生错误),是附加到队列末尾的消息(因此所有其他消息首先出现)还是存在一种在特定等待时间(可见性超时)后对它们进行优先排序的方法?

非常感谢

【问题讨论】:

  • 听起来像批处理,带有 VSEM 输入或类似的东西。触发队列对此很困难,因为下游流程/应用程序可能无法扩展到 AWS lambda 并发的强大功能。我经历过这种情况,我们使用 cloudwatch cron 来触发 lambda worker,并设置它要获取的预定义消息数量。
  • @LostJon 谢谢,我会看看 Cloudwatch cron 以及它是如何工作的。我还在某处读到 Kinesis Data Streams 可能能够做这样的事情(而不是 SQS 队列),但还不确定。

标签: amazon-web-services aws-lambda amazon-sqs


【解决方案1】:

至于限制队列,您可以添加交付延迟时间或使其长轮询,但由于您是事件驱动的,这不是一个选择。所以这让你可以将你的 lambda 限制为你想要同时完成的 x 个。

至于不能处理的消息取决于你是否使用 - 标准队列,它不会保留下一个接收消息的任何优先级。 - 一个 .fifo 队列,它将尝试再次处理它,因为它将按时间顺序排列。

但是,如果您发现错误,您应该将其直接发送到死信队列,以防止不必要的重试。

尽管通过限制它,您正在消除 AWS 的所有可扩展性,这与它的原生架构背道而驰。我建议返回数据库并查看是否可以改进那里的任何工作以避免限制。

【讨论】:

  • 问题是我们不仅有一个队列,还有许多不同的队列,其中包含大量消息。迟早我们会达到某个极限。不要误会我的意思,可扩展性很好,但我们希望将扩展限制在一定范围内(如果需要,它应该扩展到 x 个并发 lambda)。不幸的是,节流 Lambda 与 SQS 结合起来似乎有一些问题,但否则会是一个很好的解决方案。将错误放回不同的队列似乎是一种可能的解决方案。我们只是想避免错误消息被放回队列的“末尾”......
【解决方案2】:

来自Reserving Concurrency for a Lambda Function - AWS Lambda

您可以为函数配置保留并发,以保证它始终可以达到一定的并发水平。保留并发还限制了函数的最大并发。

...

您的函数不能扩展失控 – 预留并发还限制您的函数使用非预留池中的并发,从而限制其最大并发。保留并发以防止您的函数使用该区域中所有可用的并发,或者使下游资源过载。

如果在不可见超时期限内未处理消息,则将其放回队列中。除非您使用 FIFO 队列,否则无法保证 Amazon SQS 中的消息顺序,这对传输中的消息有进一步的限制。

【讨论】:

  • 谢谢,lambda 并发的问题在于它显然不能很好地与 SQS 配合使用,例如这个或类似的帖子:medium.com/@zaccharles/… 但我认为这个问题没有理想的解决方案。关于排序:那么,当发生错误时,消息被添加到队列的“末尾”(没有排序保证,但它将在同时添加的所有其他消息之后处理)?
  • 最好将队列理解为根本没有保证排序。没有非 FIFO 队列的“开始”或“结束”这样的概念。通常,您可能会看到类似 FIFO 的行为,但您不应该总是依赖这种情况。您可以尝试查看失败的消息是流向队列的后端还是前端。
  • 那篇文章很有趣!这种行为肯定会影响使用并发限制 Lambda 消费 SQS 消息的能力。
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
相关资源
最近更新 更多