首页 > 解决方案 > 如何在没有数千个连接的情况下同时调用 AWS Lambda?

问题描述

我正在尝试同时调用 AWS Lambda 来抓取一些网址。这样做时,我ThreadPoolExecutor会调用 lambda。我将 url 分成大小为 50 的批次,以限制同时运行的 lambda 的数量。然后我等待它们结束,并期望连接数被限制为 50。但是,相反,我看到 boto3 创建了 > 1000 个连接。

这是代码:

def scrape(data):
    with ThreadPoolExecutor(max_workers=10) as executor:
        result = []
        for source_url, info in data.items():
            urls = info['urls']
            source = info['source']
            for batch in batches(urls, 50):
                futures = []
                for url in batch:
                    payload = {
                        'url': url,
                        'country': source['country'],
                        'language': source['language'],
                        'topic': source['topic']
                    }

                    futures.append(
                        executor.submit(client.invoke,
                                        FunctionName='scrape_page',
                                        InvocationType='RequestResponse',
                                        Payload=bytes(json.dumps(payload), 'utf-8')))

                result.extend([future.result() for future in futures])

    return [json.loads(r['Payload'].read().decode('utf-8')) for r in result]

这是同时调用 AWS Lambda 的正确方法,还是有更好的方法?

标签: amazon-web-servicesweb-scrapingconcurrencyaws-lambda

解决方案


您的问题需要像其他人提到的那样提供更多细节,但是想指出一些事情。

  • 除了在 lambda 中使用线程之外,您还可以使您的任务具有幂等性并将它们分发给多个 lambda。
  • lambda 可用的核心数(1 个核心=2 个线程)与函数内存成正比,只有当您选择大于 1.8G 的内存大小时,您才会获得超过 1 个核心。而 afaik 您不会获得超过 2 个最大核心内存设置。
  • 您可以通过配置 Reserved Concurrency 来限制并发执行,这将保证在任何时候并发 lambda 的数量都不会超过配置的数量。

推荐阅读