来自SQS的AWS Lambda轮询:实时消息计数

时间:2018-08-23 15:06:24

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

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

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

但是,有时我从AWS控制台看到超过1万in-flight messages。最多可发送10条机上消息吗?

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

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

enter image description here

1 个答案:

答案 0 :(得分:4)

我一直在进行一些测试,并同时与AWS技术支持联系。

我目前认为的是:

  

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

1 /进行合并的事物是一个单独的实体。很有可能是一个lambda函数,它将使SQS长时间处于池中,然后调用我们的lambda函数。

2 / Pool-Lambda根本不考虑我们的Receiver-Lambda。不在乎该功能是否以最大容量运行,或者Receiver-Lambda有多少最大并发可用

3 /由于这种组合。这种行为不是我们从Lambda-SQS集成中所期望的。更糟糕的是,如果突然,队列中爆发了数百万条消息。 Receiver-Lambda并发永远无法赶上pooling-Lambda发送的消息量,从而导致工作丢失

测试:

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

结果:

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

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

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

  

1 /假设是正确的,有一个“投票者”

     

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

     

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