【问题标题】:Can a Lambda container host more than one function at once?一个 Lambda 容器可以同时托管多个函数吗?
【发布时间】:2018-11-14 13:04:12
【问题描述】:

是否可以将多个 Lambda 函数定义部署到同一个容器实例?

我了解给定的 Lambda 容器一次最多只能执行一个函数,但想了解函数与宿主容器之间的组合关系。

例如,在带有 AWS Toolkit Extensions 的 Visual Studio 的无服务器应用程序项目类型中,可以在单个项目中定义多个函数,但是这些函数是通过 CloudFormation 部署到单独的容器中还是代表项目的单个容器中?

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    我认为将流程分开可能会有所帮助:

    • lambda 部署 是一个代码压缩文件和一个匹配的配置。对于您的无服务器应用项目类型,当您为一个项目提供多个 lambda 函数时,您将创建多个部署。
    • lambda instance 是托管在 container 内的部署的运行版本。一个容器中只允许一个 lambda 实例,这是 AWS 的保证。这意味着您永远无法访问当前正在运行的实例之外的代码/内存/文件(无论是您的还是其他任何人的!)

    作为一种优化,AWS确实通过冷冻和解冻容器来重复使用实例。这是因为启动一个新容器、复制部署并执行部署的初始化代码(称为冷启动)的成本很高。

    【讨论】:

    • 每个部署可以有多个处理程序吗?我需要了解是否可以将不同的处理程序托管在一起并重新使用相同的执行上下文,例如静态初始化/内存中缓存,例如映射到通过网关实例映射的不同端点的独立 Lambda 函数处理程序的 API 网关。
    • 您可以在部署中拥有任何您想要的代码,但只有您配置的处理程序才会被调用。因此,您可以在处理程序之间共享编译时信息(例如常量文件或通用功能),但不能共享运行时信息(例如连接池或在 init 上设置的变量)。 (n.b. 运行时信息由容器而不是实例共享,因此同一处理程序的两个并发实例将在不同的容器中运行。
    • 您项目中的每个单独的函数都是无状态且自包含的。
    • 你知道我在哪里可以找到任何来自 AWS 的文档,这些文档确认“容器中只允许一个 lambda 实例,这是 AWS 的保证”?
    【解决方案2】:

    没有关于此事的官方文件,但我将分享我过去几年从 Docs/Posts/Conferences 收集到的内容:

    Lambda 函数是容器化服务之上的“框架”(或类似的东西,这个词是我能想到的最接近的词,也是我从 AWS 代表那里听到的唯一一个词)。每次调用 lambda 函数时,都会运行一个容器(它可能是现有的、暂停的 - 增加性能提升,或者是全新的,你永远无法知道它是哪一个。)

    您可以假设,容器 instance(使用实例,因为它在 ECS 中使用,主机)是相同的,记住有一些用于 DB Connection pooling 的解决方法和一些事情喜欢,但没有人向你保证。

    【讨论】:

      【解决方案3】:

      CloudFormation 会将函数部署到同一个 AWS 账户。这发生在 AWS 用户账户级别。它没有运行功能。

      Lambda 是事件驱动的,仅在触发时运行。就用户体验而言,Lambda 的每个实例都是独立的,并且在触发时“部署在自己的容器中”。

      也许抽象层下正在发生更深层次的事情,但这就是您将体验到的方式。

      【讨论】:

        【解决方案4】:

        我通过使用 ExpressJS+NodeJS 做到了这一点。每个函数都是不同的 ExpressJS 路由。但是,到目前为止,我还不能使用 Spring Cloud Function 来做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-26
          • 2017-02-15
          • 2015-04-09
          • 2019-03-26
          • 2015-12-16
          相关资源
          最近更新 更多