扩展AWS Lambda

时间:2017-09-19 18:30:36

标签: c# amazon-web-services lambda asp.net-core aws-lambda

我有一个包含大量来自不同来源的消息的队列。我也有lambda来处理这个队列中的消息。关键是我每个SQS请求最多只能读取10条消息。由于我们有lambda的时间限制,这意味着我可以在每个lambda函数运行中进行不超过10次调用。 如何“告诉”lambda一次运行多个函数实例,以便每次从队列中处理更多消息?

4 个答案:

答案 0 :(得分:1)

我认为最适合你的是使用Kinesis流而不是SQS。

AWS documentation on concurrent Lambda execution

答案 1 :(得分:1)

不幸的是,鉴于您当前的设置,在没有显着开销的情况下优化它并不是一个好方法。如果您希望计时器触发多个lambda,则可以使用多个计时器或更快的计时器。但是,您需要大量开销才能确保其按预期工作。您可以考虑使用几种解决方案来提高效率:

  1. 使用Kinesis Streams
  2. 通过SNS发送消息,而不是在SQS队列中缓冲并实时处理
  3. 将lambda代码移动到docker容器中并从中创建一个AWS服务,该服务可以充当SQS的多处理器(即,一次运行容器的5个实例,并具有向上/向下扩展触发器)
  4. 如果您可以避免使用SQS,我强烈推荐使用SNS选项,因为它的开销最小。无论如何,在每个AWS集成方法的范围内,对于lambda来说都是一个SNS端点。它是如何设置服务的。 SNS集成将在每次发送消息时显示lambda的实例,并根据您的使用情况进行扩展,而不是您需要管理扩展和分发。这将导致不必要的麻烦。

    至于在计时器上运行lambda,使用在计时器上设置为事件驱动的服务是不好的做法。就个人而言,当我为AWS开发时,我的所有事件驱动功能都是Lambda,我所有的时间驱动功能都写入docker容器,然后在ECS上运行。在计时器上运行lambda是由于客户请求它而在事后开发的,而不是服务本来用于的目的。

答案 2 :(得分:0)

我建议使用Kinesis,所有这些都是自动化的。

您可以将批量大小设置为所需的大小,并将批量交付。如果要并行运行它们,可以创建多个流并将其分配给同一个Lambda,它将为每个流创建实例。

答案 3 :(得分:0)

要直接回答您的问题,一个解决方案可能是更改您的lambda以执行以下操作:

  1. 从SQS接收消息
  2. 如果收到的零个以上, 使用Lambda API进行自我调用。这将导致并行 执行Lambda的另一个实例以在当前 调用正在处理步骤3中的消息。您必须使用Event调用类型才能使它起作用。
  3. 处理 消息。

这是一种递归形式,基本情况是“队列中没有更多消息”。每次调用lambda都会处理一个批处理,并且只要可以从队列中提取更多消息,就会并行处理这些批处理。一旦队列为空,直到下次下次由计时器触发lambda时,才会创建更多调用。

这不是一个 great 解决方案,但是它将为您有效地工作,并且不应实施任何重大更改,因为它根本不需要您更改体系结构。

>

[1] https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html