在 dynamodb table 上调用 lambda 函数时无法创建新的本机线程错误 - 如何避免?

Unable to create new native thread error when invoking lambda function on dynamodb table - how to avoid?

我有一个 lambda 函数可以查询一些 DynamoDB 表和 returns 其中的一些条目。调用了几次一切正常,但我现在正在对我的后端进行压力测试,当我在短时间内反复调用该函数时,出现以下错误:

"errorMessage":"unable to create new native thread","errorType":"java.lang.OutOfMemoryError"

我正在使用 DynamoDB 的空间索引功能,错误消息似乎暗示与空间索引查询有关的行导致了问题。这些是与地理查询有关的行:

GeoDataManagerConfiguration config = new GeoDataManagerConfiguration(ddb, "geo");

        GeoDataManager geoIndexManager = new GeoDataManager(config);

        GeoPoint centerPoint = new GeoPoint(request.latitude, request.longitude);

        QueryRadiusRequest queryRadiusRequest = new QueryRadiusRequest(centerPoint, request.radius);

        QueryRadiusResult queryRadiusResult = geoIndexManager.queryRadius(queryRadiusRequest);

具体来说,尽管以下行似乎是问题的根源:

QueryRadiusResult queryRadiusResult = geoIndexManager.queryRadius(queryRadiusRequest); 

这是怎么回事?为什么在重复调用函数时这一行会抛出这个错误?从表面上看,dynamoDB 上的 spatial indexing/look ups 似乎无法处理大量调用,这确实没有意义,当然在构建时它是为了处理规模而设计的。是否有一些设置可以让我在 aws 中分配更多内存来避免这个问题?

参见AWS Lambda Limits

每次调用限制为 1024 个线程,每个区域最多 100 个调用。

如果您在单个函数中达到了该限制,您可以在代码中设置一个低于该限制的硬限制,或者添加一个线程池和一个队列。

我之前编写了一个 Lambda 函数来读取配置文件并将测试数据打包到自身的其他副本,以绕过此类限制。

使您的 GeoDataManagerConfiguration 静态化,并且不要为每个请求创建它(在您的 lambda 处理程序中)。 否则,您将为每个请求创建一个执行服务:https://github.com/awslabs/dynamodb-geo/blob/8fd3e7b408650a937735ffb6527516dba239a1db/src/com/amazonaws/geo/GeoDataManagerConfiguration.java#L164