我有一个包含大量来自不同来源的消息的队列。我也有lambda来处理这个队列中的消息。关键是我每个SQS请求最多只能读取10条消息。由于我们有lambda的时间限制,这意味着我可以在每个lambda函数运行中进行不超过10次调用。 如何“告诉”lambda一次运行多个函数实例,以便每次从队列中处理更多消息?
答案 0 :(得分:1)
我认为最适合你的是使用Kinesis流而不是SQS。
答案 1 :(得分:1)
不幸的是,鉴于您当前的设置,在没有显着开销的情况下优化它并不是一个好方法。如果您希望计时器触发多个lambda,则可以使用多个计时器或更快的计时器。但是,您需要大量开销才能确保其按预期工作。您可以考虑使用几种解决方案来提高效率:
如果您可以避免使用SQS,我强烈推荐使用SNS选项,因为它的开销最小。无论如何,在每个AWS集成方法的范围内,对于lambda来说都是一个SNS端点。它是如何设置服务的。 SNS集成将在每次发送消息时显示lambda的实例,并根据您的使用情况进行扩展,而不是您需要管理扩展和分发。这将导致不必要的麻烦。
至于在计时器上运行lambda,使用在计时器上设置为事件驱动的服务是不好的做法。就个人而言,当我为AWS开发时,我的所有事件驱动功能都是Lambda,我所有的时间驱动功能都写入docker容器,然后在ECS上运行。在计时器上运行lambda是由于客户请求它而在事后开发的,而不是服务本来用于的目的。
答案 2 :(得分:0)
我建议使用Kinesis,所有这些都是自动化的。
您可以将批量大小设置为所需的大小,并将批量交付。如果要并行运行它们,可以创建多个流并将其分配给同一个Lambda,它将为每个流创建实例。
答案 3 :(得分:0)
要直接回答您的问题,一个解决方案可能是更改您的lambda以执行以下操作:
Event
调用类型才能使它起作用。这是一种递归形式,基本情况是“队列中没有更多消息”。每次调用lambda都会处理一个批处理,并且只要可以从队列中提取更多消息,就会并行处理这些批处理。一旦队列为空,直到下次下次由计时器触发lambda时,才会创建更多调用。
这不是一个 great 解决方案,但是它将为您有效地工作,并且不应实施任何重大更改,因为它根本不需要您更改体系结构。
>[1] https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html