Aws lambda 有没有一种方法可以通过编程方式知道有多少Lambda函数的并发实例正在执行?

Aws lambda 有没有一种方法可以通过编程方式知道有多少Lambda函数的并发实例正在执行?,aws-lambda,Aws Lambda,让我们假设,在给定时间,某个特定Lambda函数的多个实例已被异步调用 那么,有没有办法找到Lambda函数当前运行的活动的并发实例的数量 在仪表板中的帐户级别指标中,我们可以找到并发执行的数量。另外,我认为对于每个新的Lambda容器创建,Cloudwatch都会为Lambda函数创建一个新的日志流。也许有可能以某种方式使用这些 但我想知道是否存在一种不同的方式以编程方式获取这些数字,例如使用boto3api等?简单的答案是否定的 您可以通过编程方式访问cloudwatch指标(请参阅:),但

让我们假设,在给定时间,某个特定Lambda函数的多个实例已被异步调用

那么,有没有办法找到Lambda函数当前运行的活动的并发实例的数量

在仪表板中的帐户级别指标中,我们可以找到并发执行的数量。另外,我认为对于每个新的Lambda容器创建,Cloudwatch都会为Lambda函数创建一个新的日志流。也许有可能以某种方式使用这些


但我想知道是否存在一种不同的方式以编程方式获取这些数字,例如使用
boto3
api等?

简单的答案是否定的

您可以通过编程方式访问cloudwatch指标(请参阅:),但是这些指标落后一分钟。更糟糕的是,当单个lambda返回
调用时
,您只能在整个帐户中获得
ConcurrentExecutions
,这意味着您最好将lambda放入它自己的AWS帐户中,即使这样,你仍然会落后一分钟——这通常比兰姆达的平均寿命要长


不过,我应该指出,通过“保留并发”,lambda确实公开了一种至少在基本上控制并发的方法。这方面的示例用例是,如果您正在调用具有有限连接池的外部服务/数据库。

我通过让每个正在运行的lambda实例将名为{task}{request_id}.json的状态json文件写入跟踪lambda的bucket中的特定s3文件夹来实现这一点。我有三个子文件夹,/Running,/Completed,/Failed,因此我可以跟踪完成和失败的总数。找出有多少正在运行相当于列出/running文件夹中的文件,这非常快,不需要实际获取或打开文件

每个lambda首先在/Running中创建一个状态文件。它在try/except块中执行其工作,以捕获所有Python异常,然后读取该请求的运行文件夹中的dict,并使用其他信息(例如总持续时间和任何错误详细信息)对其进行更新。然后,它删除/Running中的状态文件,并在/Completed或/Failed中创建状态文件

我要说的是,我的应用程序具有持续时间通常为400秒的lambda实例,因此这种跟踪的开销不算太大,而且在任何一个作业中,它往往只运行几千个lambda。如果您的应用程序以高频率启动小型lambda,那么这可能是太多的开销

在我的例子中,请求是在代码中显式发出的(而不是被触发),但每个请求都是异步并行运行的。AWS Lambda系统将对超过并发限制的请求进行排队,然后发生节流。一旦lambda变得可用,排队和节流的请求将启动一个达到并发限制的实例


我还介绍了另一个名为runtoken{parent_pid}.json的文件,它建立在一个已知的s3文件夹中,每个lambda都可以检查它是否被授权运行。提供{parent_pid}是为了防止lambda混淆新授权和旧授权。但基本上,如果出于某种原因我需要停止执行,我所需要做的就是删除runtoken文件。内部循环中的每个lambda都会检查文件是否存在,以及父进程id(进程id)是否与其启动时使用的父进程id匹配。如果没有,它将正常退出并向AWS lambda返回成功状态代码,同时向/Failed文件夹发布状态。如果lambda退出时出现错误,例如sys.exit(1),那么AWS lambda启动器将重试lambda函数。所有lambda都会检查正在运行的文件夹,以确保它们不会被重试。请求id在重试的lambdas中是相同的。

非常感谢您的解释。不过,我想知道为什么AWS不允许我们访问这些信息。我猜这是因为AWS希望lambda被视为无状态执行资源,而不受其并发性的影响(例如,我怀疑对于任何服务器集群框架来说,回答同样的问题都很困难)。作为练习,我建议你再问一次这个问题,看看是否有一种更“lamdaish”的方法来实现并发,看看你想实现什么。