【问题标题】:AWS Lambda Polling from SQS: in-flight messages count来自 SQS 的 AWS Lambda 轮询:进行中的消息计数
【发布时间】:2019-01-30 00:23:48
【问题描述】:

我在 SQS 队列中有 20K 条消息。我还有一个 lambda 将处理 SQS 消息,并将数据放入 ElasticSearch 服务器。

我已将 SQS 配置为 lambda 的触发器,并将 Lambda 的 SQS 批量大小限制为 10。我还限制了 lambda 的唯一一个实例可以在给定时间运行。

但是,有时我会从 AWS 控制台看到超过 10K in-flight messages。是否应该在 10 条飞行消息中达到最大值?

因此,lambda 只能正确处理 9K 的 SQS 消息。

下面是一个屏幕截图,显示我已将 lambda 限制为在给定时间仅运行 1 个实例。

【问题讨论】:

  • 您显然没有限制同时 Lambda 的数量。默认情况下,您可以同时运行 1000 个。这与您看到的飞行中消息的数量大致匹配。我会验证你的限制是否正确。一般来说,单线程 Lambda 与它的设计目的相反。
  • @stdunbar 我添加了一张图片来显示当前的并发限制,它是 1。
  • 文档说 Lambda 会删除“一旦您的 Lambda 函数成功完成”的消息。我想知道您的功能是否没有发出功能“成功完成”的信号(无论这意味着什么)?您的函数是否可能在完成之前超时?
  • @JohnRotenstein 来自 AWS Doc ...the handler can return a value...if you use the Event invocation type (asynchronous execution), the value is discarded. 我检查了分析,lambda 实例没有超时。
  • @user1187968 你得到答案了吗?我面临同样的问题,同样的配置

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


【解决方案1】:

我一直在做一些测试并同时联系 AWS 技术支持。

我现在相信的是:

Amazon Simple Queue Service 支持 5 次并发函数调用的初始突发,并将并发性每分钟增加 60 次并发调用。 Doc

1/ 进行轮询的东西是一个单独的实体。它很可能是一个 lambda 函数,它将长轮询 SQS,然后调用我们的 lambda 函数。

2/ 轮询 Lambda 根本没有考虑我们的任何 Receiver-Lambda。它不关心函数是否以最大容量运行,也不关心 Receiver-Lambda 有多少最大并发数

3/ 由于这种组合。这种行为不是我们对 Lambda-SQS 集成的预期。更糟糕的是,如果你突然有数百万条消息在你的队列中爆发。 Receiver-Lambda 并发永远赶不上轮询 Lambda 发送的消息量,导致工作丢失

测试:

  • 创建一个需要 30 秒才能返回 true 的 Lambda 函数;
  • 将该函数的并发设置为 50;
  • 将 300 条消息推送到队列中(可见性超时:10 分钟,批量消息计数:1,不重新驱动)

结果:

  • 可用消息的数量逐渐增加
  • 起初,Receiver-Lambda 可以处理的消息很少
  • 半分钟后,可用消息超出 Receiver-Lambda 的处理能力
  • 这些消息将被丢弃到死队列。由于轮询 Lambda 无法调用 Receiver-Lambda

我会在收到 AWS 支持的确认后立即更新此答案

支持回答。截至 2019 年第一季度,TL;DR 版本

1/ 假设是正确的,有一个“轮询”

2/ Poller 不考虑保留并发 作为其算法的一部分

3/ 该轮询器的硬限制为 1000

2019 年第二季度:

以上信息需要更新。支持人员说轮询器正确地考虑了保留并发,但它应该至少是 5。SQS-Lambda 集成仍在更新中,这个答案不会。因此,如果您遇到一些奇怪的问题,请咨询 AWS

【讨论】:

  • 你有没有想过这个问题?
  • @twilco 我得到了支持的最终答复,我将把 TL;DR 版本放在这里。请注意,内部实施随时可能发生变化
猜你喜欢
  • 2019-09-30
  • 2018-05-10
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多