解决突发时的 SQS Lambda 过度轮询问题

Solving SQS Lambda Over-polling when bursting

提问人:John 提问时间:12/10/2021 更新时间:11/17/2023 访问量:466

问:

我有一个场景,我想使用 SQS 触发 Lambda 函数来索引 Elasticsearch 中的文档。我遇到的问题是,排队的消息数将从 0 到数十万不等,具体取决于应用程序活动。

为了避免 Elasticsearch 不堪重负,我需要限制同时运行的 Lambda 函数数量。虽然我可以设置预留并发,但当大量消息排队并且 SQS 轮询器的数量增加时,这将导致大量限制。

我考虑过的选项:

  1. 捕获受限制的消息 (DLQ) 并重新排队进行处理。这似乎非常低效,并且消息可能会重新排队多次。
  2. 设置一个随机消息计时器来人为地限制。同样,效率非常低,因为它会引入人为的等待时间,即使它是队列中的唯一消息。一种变体是仅在对受限制的消息进行排队时设置等待计时器。
  3. 具有单个消息组 ID 的 FIFO 队列。当大量消息排队时,可能会超过FIFO队列的最大吞吐量。
  4. 放弃“push”方法,并计划 Lambda 使用 CloudWatch Events 轮询队列。需要实现更长的轮询时间(例如 1 分钟),因此可能需要更长的时间来处理消息。
  5. 放弃“push”方法,使用传统的 worker 实例。它经过了尝试和测试,可以控制并发/计时,但感觉我应该能够为此避免 IaaS?!

我读过很多文章,但令人惊讶的是,这个问题似乎没有任何干净的解决方案,因为我确信这是一个非常普遍的问题。如果我们可以将 SQS 轮询器并发设置为与 Lambda 并发匹配,那将是不错的:)

谢谢 John

Elasticsearch AWS-Lambda 错误处理 Amazon-SQS 限制

评论

0赞 John Rotenstein 12/10/2021
核心问题是什么?如果有大量消息排队,较小的预留并发是否会导致问题?或者你只是担心积压?
0赞 John 12/13/2021
嗨,约翰。核心问题是,Lambda 轮询器的数量将随着队列大小的增加而增加,并压倒处理队列的少量并发 Lambda,从而导致由于限制而导致消息失败。这似乎是亚马逊应该解决的疏忽......
0赞 John Rotenstein 12/13/2021
听起来让 SQS 触发 Lambda 不是一个合适的架构。也许每分钟触发一次 Lambda,或者使用 EC2 实例而不是 Lambda?
0赞 John 12/13/2021
是的,我认为传统的消费者实例方法(上面的第 5 条)可能是一种更安全的管理方式。感谢您的回复!