我有一个基于 python 的 lambda 函数,它基于 kinesis firehose 流触发 s3 put 操作,该流以每分钟大约 10k 条记录的速率发送数据。现在 lambda 函数只是对数据进行一些小的修复,并以 100 个批次将其传递到 logstash 实例。lambda 执行时间为 5-12 秒,因为它每分钟运行一次,这很好。
我们正在考虑在将流式数据发送到 logstash 之前使用更多信息来丰富流式数据。传入的每条消息都有一个“id”字段,我们希望在某种数据库中查找该 id,从数据库中获取一些额外信息并将其注入到对象中,然后再传递它。
问题是,我不能让它足够快。我尝试将所有数据(60 万条记录)加载到 DynamoDB 中,并在 lambda 函数中对每个记录循环执行查找。这大大减慢了执行速度。然后我认为我们不必两次查找相同的 id,所以我使用列表 obj 来保存已经“查找”的数据 - 这在一定程度上降低了执行时间,但仍然与我们的结果相差无几我喜欢。
然后我想到了预加载整个数据库数据集。我对此进行了测试 - 只需将 dynamodb 中的所有 600 条记录转储到“缓存列表”对象中,然后开始循环遍历 s3 对象中的每条记录。数据在大约一分钟内转储,但缓存列表现在非常大,每次查找它需要 5 秒(比访问数据库慢得多)。
我对在这里做什么感到茫然——我完全意识到 lambda 可能不是合适的平台,如果我们不能让它工作,我们可能会转向其他产品,但首先我想我' d 看看社区是否有一些关于如何加快这件事的指示。