Amazon web services AWS Lambda中哪一个更快:(网络调用Vs子进程)

Amazon web services AWS Lambda中哪一个更快:(网络调用Vs子进程),amazon-web-services,networking,operating-system,aws-lambda,Amazon Web Services,Networking,Operating System,Aws Lambda,我有两段代码 Lambda:(用Python编写) Lambda B:(用NodeJs书写) 场景1: Lambda使用一些有效负载调用Lambda B,并等待Lambda B的输出。 Lambda B作为其逻辑的一部分进行api调用并返回数据。我使用boto3(调用类型:RequestResponse)调用另一个lambda 场景2: 我创建了一个包含这两段代码的zip文件,并使用该zip文件创建了一个lambda。在python代码中,我使用subprocess.call()调用NodeJs

我有两段代码

Lambda:(用Python编写) Lambda B:(用NodeJs书写)

场景1: Lambda使用一些有效负载调用Lambda B,并等待Lambda B的输出。 Lambda B作为其逻辑的一部分进行api调用并返回数据。我使用boto3(调用类型:RequestResponse)调用另一个lambda

场景2: 我创建了一个包含这两段代码的zip文件,并使用该zip文件创建了一个lambda。在python代码中,我使用subprocess.call()调用NodeJs代码

谁能告诉我哪种方法更快。上述方法的优缺点是什么(w.r.t:计费时间、持续时间、可伸缩性等)

根据我的理解,上述方法的缺点是:

场景1:

  • 由于网络通话,我将收取两次账单(网络通话持续时间)
  • 有一些网络开销 场景2:

  • 子进程创建开销

  • 这里的答案归结为“基准测试”

    进程创建开销本身应该是最小的,但是启动节点子级的开销可能是性能杀手

    原因集中在容器重用上

    当第一次调用节点Lambda函数,然后调用完成时,容器及其内部的进程将保持热备用状态,以备下次调用。当这种情况发生时,您的进程已经在运行,处理程序函数将在几微秒内被调用。设置容器、启动流程以及在第二次调用中运行任何初始化代码都不需要时间

    这意味着,在场景1中,函数启动的时间最小化。开销是调用方向Lambda发出请求和Lambda返回响应所需的时间(一旦可用)。在这两件事之间,几乎没有时间

    相比之下,如果在场景2中为每个请求启动一个子进程,那么每个请求都会有所有的初始化开销

    我最近有机会在Lambda中运行一些代码,这些代码使用Lambda不支持的语言,由Node.js中编写的Lambda函数调用。我使用一个子进程来执行此操作,但有一个转折点:子进程被编写为从STDIN读取并写入STDOUT,用于从js代码到IPC。然后我可以向子进程发送一个“请求”,子进程写入响应时会触发一个事件

    因此,子节点是从节点开始的,其控制节点对象位于全局变量中,前提是尚未存在。。。但由于容器的重用,它很可能已经存在了

    <节点> /lambda,设置<代码>上下文。CalbAdWaSwitsFuffTyError循环< /C> >允许lambda回调考虑调用完成,即使事件循环仍在运行,这意味着我可以让这个子进程在调用中运行。

    有了这个机制,当容器被重用时,我为每个小于3毫秒的Lambda调用实现了最佳情况下的运行时。对于每个新容器,子进程的第一次启动时间超过1000毫秒。如果从第一个容器内部调用第二个Lambda函数,3ms的时间无疑比我所能达到的要好,但是节省下来的钱来自于在容器保持活动的同时保持内部进程的活动

    因为您的外部函数是Python,所以我不清楚它对您有什么影响,或者它有多有用,但我认为它可能有助于说明在调用之间保持子进程活动的概念的价值


    但是,从您拥有的开始,并对两个场景(多个Tine)进行基准测试,以确保任何超过预期的RunTine都不是新容器创建的产物。

    您尝试过第二个场景吗?从直觉上看,它似乎具有明显更快、更便宜的潜力,但如果做得不够理想,情况可能会更糟。相反,容器重用的含义可能意味着场景1更有效,除非您以可重用的方式管理场景2中的子流程。我对aws lambda的理解有些模糊。你能帮我理解aws lambda是如何处理多个请求的吗。它会产生同一代码的多个实例吗?如果我在给定时间收到1000个请求。。它会创建1000个lambdas实例吗?如果aws继续为lambda执行创建新实例,它是否有助于优化“热备用”场景的代码?正如我提到的,创建了足够的容器来处理并发请求的工作负载。多个请求在同一时间将各自获得自己的容器,因为只有在新请求到达时才创建新容器,并且没有可用的空闲容器来为其提供服务。多个请求永远不会同时命中同一个容器。