【问题标题】:Lambda Low Latency Messaging OptionsLambda 低延迟消息传递选项
【发布时间】:2020-03-15 10:34:53
【问题描述】:

我有一个 Lambda,它需要将消息发送到另一个 Lambda 以执行某些操作。在我的特殊情况下,它会将消息传递给 Lambda,以便它执行 HTTP 请求并刷新缓存条目。

目前我依靠 AWS 开发工具包发送 SQS 消息。其机制运行良好。我担心的是 SQS 发送方法调用平均需要大约 50 毫秒才能完成。考虑到我在 Lambda 中,我无法在后台执行此操作并期望它在 Lambda 返回并被冻结之前完成。

如果我需要进行多个 SQS 发送调用,情况会更加复杂,这尤其糟糕,因为 Lambda 负责响应低延迟 HTTP 请求。

AWS 中是否有任何替代方案可以在 Lambda 之间进行通信,不需要同步 API 调用,并且表现出更多的“一劳永逸”和异步行为?

【问题讨论】:

  • EventBridge 在异步模式下支持 lambda。也许值得研究一下?
  • 核心问题似乎是,无论底层技术(SQS、SNS、EventBridge)如何,它们都依赖于对 AWS API 的 HTTP API 调用,这会引入某种形式的延迟,这可能非常相似。除非 SQS 调用等待某些操作完成,而 EventBridge 不会并立即返回 202。这是我在文档中不清楚的部分。

标签: amazon-web-services aws-lambda amazon-sqs amazon-sns


【解决方案1】:

虽然有多种方法可以从另一个触发一个 lambda,但(根据我的经验)最快的方法之一是直接触发最终 lambda 的 ARN。

您是否尝试过使用 AWS 开发工具包从另一个 Lambda 调用?
(例如在 Python 中使用 Boto3,我是这样实现的)。

见下文,InvocationType = 'Event' 参数有助于异步调用目标 Lambda。

下面的代码采用 2 个参数(name,可以是您的目标 Lambda 函数的名称或其 ARN,params 是一个 JSON 对象,其中包含您希望作为输入传递的输入参数)。试试看!

import boto3, json


def invoke_lambda(name, params):

    lambda_client = boto3.client('lambda')

    params_bytes = json.dumps(params).encode()
    try:
        response = lambda_client.invoke(FunctionName = name,
                                        InvocationType = 'Event',
                                        LogType = 'Tail',
                                        Payload = params_bytes)
    except ClientError as e:
        print(e)
        return None

    return response

希望对你有帮助!

有关更多信息,请参阅 Boto3 文档上的 Lambda's Invoke Event

或者,您也可以使用Lambda's Async Invoke

【讨论】:

    【解决方案2】:

    如果不知道您使用哪种语言编写 Lambda 函数,很难给出准确的答案。为了至少使“暖”函数调用更快,我会确保您在 Lambda 事件处理程序之外创建 SQS 客户端,以便它可以重用连接。 AWS 开发工具包应该使用 HTTP 连接池,因此它不必在每次发出 SQS 请求时重新建立连接并通过 SSL 握手等所有操作,只要您重用 SQS 客户端即可。

    如果这还不够快,我会让处理 HTTP 请求的 Lambda 函数通过异步调用将“后台”工作传递给另一个 Lambda 函数。然后第一个 Lambda 函数可以返回一个 HTTP 响应,而第二个 Lambda 函数继续工作。

    【讨论】:

    • 谢谢。我正在使用 Go,目前确实在处理程序之外有 HTTP 客户端和池。发送的延迟也与本文提到的相匹配,所以我相信它是准确的 - softwaremill.com/amazon-sqs-performance-latency。我可能不得不走异步/事件调用路线。您失去了队列的一些好处,但在我的用例中应该没问题。
    【解决方案3】:

    您也可以尝试使用 Lambda 目标,具体取决于您的用例。有了这个,您不需要手动将东西放入队列中。

    https://aws.amazon.com/blogs/compute/introducing-aws-lambda-destinations/

    但这限制了您的灵活性。从我的角度来看,直接链接 lambdas 是一种反模式,如果您需要,请使用步进函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2014-09-27
      • 2011-03-27
      相关资源
      最近更新 更多