Amazon web services 限制从AWS SQS触发的AWS Lambda的并发调用(保留并发被忽略)?

Amazon web services 限制从AWS SQS触发的AWS Lambda的并发调用(保留并发被忽略)?,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,对我来说,当我开始时,这似乎是一个简单的用例,但结果比我预期的要困难得多 问题 我有一个AWS SQS作为一个作业队列,它触发一个worker AWS Lambda。但是,由于工作lambda共享不可伸缩的资源,因此将并发运行lambda的数量限制为(为了示例起见)不超过5个同时运行的lambda是很重要的 据英国《每日邮报》报道,这很简单 保留并发还限制了 函数,并应用于整个函数 但是,SQS似乎完全忽略了将保留并发性-属性设置为5,在我的例子中,队列正在运行的消息-属性根据放入队列的消息量显

对我来说,当我开始时,这似乎是一个简单的用例,但结果比我预期的要困难得多

问题

我有一个AWS SQS作为一个作业队列,它触发一个worker AWS Lambda。但是,由于工作lambda共享不可伸缩的资源,因此将并发运行lambda的数量限制为(为了示例起见)不超过5个同时运行的lambda是很重要的

据英国《每日邮报》报道,这很简单

保留并发还限制了 函数,并应用于整个函数

但是,SQS似乎完全忽略了将
保留并发性
-属性设置为5,在我的例子中,队列
正在运行的消息
-属性根据放入队列的消息量显示接近20-30次并发执行

问题

我找到的最接近的解决方案是使用SQS FIFO队列,并将值设置为随机选择或在1-5之间交替。但是,由于工作负载不均匀,这并不是最优的,因为最好按照实际工作负载而不是偶然地分布并发性

我还尝试使用AWS Step函数,因为它有一个MaxConcurrency参数,这似乎在小型作业队列上工作得很好,但由于每个状态的输入/输出限制为32kb,这在我的用例中是不可行的

有没有人找到更好的或替代的解决方案?是否应该使用
保留并发
的其他方式

类似


以下是我发现的一些类似问题,但我认为我的问题不同,因为我对限制不感兴趣,而且(尽管我自己没有尝试过)我不明白为什么会与SQS行为不同。

根据AWS文档AWS SQS不考虑保留并发性。如果要处理的批数大于保留并发数,则您的消息可能会以死信队列结束:

如果您的函数返回错误,或者由于处于 最大并发性,处理可能会成功,但需要额外的 尝试。使邮件在发送前有更好的处理机会 将它们发送到死信队列时,在 源队列的重新驱动策略至少为5。


您可以查看这篇文章了解详细信息:

您确定运行的lambda超过5个吗?仅仅因为一条消息正在传输并不意味着它有自己的专用lambda运行。SQS不知道允许运行多少个lambda,它将作业发送出去,lambda以任何方式处理它们。SQS只是确保它们得到处理。可能只是5个lambda中的每一个都在按顺序处理4-6个作业。关于SQS的任何内容都不能覆盖保留区并发。要基于@bryan60的评论,您可以使用CloudWatch指标和日志验证并发执行的数量。如果处理的邮件比预期的多,也可能是批量大小?@bryan60,是的,结果证明你和hephalump是对的。飞行中的消息似乎不是一个准确的表示,至少根据lambda的监视统计数据,执行的并发lambda不超过5个。@bryan60但是,这引发了一些问题,即当lambda被限制时,如何处理可见性超时。如果有人感兴趣,我会提出一个后续问题。