AWS Lambda 上的 Spring Boot 应用程序 – 使用 Spring Cloud Function 测量冷启动和热启动部分

aws lambda 上的 spring boot 应用程序 - 使用 spring cloud function 测量冷启动和热启动部分

介绍

在第 8 部分中,我们介绍了 spring cloud 函数背后的概念,在第 9 部分中,我们演示了如何使用 java 21 和 spring boot 3.2 通过 spring cloud function 开发 aws lambda。在本系列的这篇文章中,我们将测量冷启动和热启动时间,包括在 lambda 函数上启用 snapstart,同时应用各种启动技术,例如启动 dynamodb 调用和启动(代理)整个 api 网关请求,而无需通过网络。我们将使用 spring boot 3.2 示例应用程序进行测量,对于所有 lambda 函数,使用 java_tool_options: “-xx:+tieredcompilation -xx:tieredstopatlevel=1” 并为它们提供 lambda 1024 mb 内存。

使用 spring cloud function 并使用 java 21 和 spring boot 3.2 测量冷启动和热时间

我们首先解释如何在 lambda 函数上启用 aws snapstart,因为它(顶部启动)提供了最大的 lambda 性能(尤其是冷启动时间)优化潜力。这只是一个配置问题:

snapstart:  applyon: publishedversions 

应用于 lambda 函数属性或 sam 模板的全局函数部分。我想更深入地了解如何在 snpastart 之上为我们的用例使用各种启动技术。我在文章 aws lambda snapstart – 测量启动、端到端延迟和部署时间中解释了启动背后的想法

1) 启动 dynamodb 请求的代码可以在这里找到。

该类还实现了 crac 项目的 import org.crac.resource 接口。

通过这个调用

core.getglobalcontext().register(this);

getproductbyidwithdynamodbrequestpriminghandler 类将自身注册为 crac 资源。

我们还通过从 crac api 实现 beforecheckpoint 方法来启动 dynamodb 调用。

      @override      public void beforecheckpoint(org.crac.context context) throws exception {             productdao.getproduct("0");      }

我们将在 lambda funtiom 的部署阶段以及拍摄 firecracker microvm 快照之前调用它。

2) 启动整个 api gateway 请求的代码可以在这里找到。

这个类还额外实现了 import org.crac.resource 接口,如上例所示。
我们将重新使用我在文章 aws lambda snapstart – 第 6 部分启动 java 11 和 micronaut、quarkus 和 spring boot 框架的请求调用 中描述的丑陋技术。我不建议在生产中使用这种技术,但它展示了通过预加载 spring boot 和 spring cloud function 模型以及执行 dynamodb 的 lambda 模型之间的映射来启动整个 api gateway 请求来减少冷启动的进一步潜力调用启动。

id 等于 0 的 /products/{id} 的 api gateway 请求构造 api gateway json 请求如下所示:

      private static string getapigatewayrequestmultiline () {             return  """                        {                      "resource": "/products/{id}",                      "path":  "/products/0",                      "httpmethod": "get",                      "pathparameters": {                            "id": "0"                         },                       "requestcontext": {                          "identity": {                        "apikey": "blabla"                      }                      }                    }           """;      }

使用 spring cloud function functioninvoker 类来启动(代理)整个 api 网关请求,而无需通过网络,beforecheckpoint 类通过传递上面构造的 api 网关 json 请求的输入流来调用其 handlerequest 方法,如下所示:

@overridepublic void beforecheckpoint(org.crac.context context) throws exception {            new functioninvoker().handlerequest(   new bytearrayinputstream(getapigatewayrequestmultiline().  getbytes(standardcharsets.utf_8)),  new bytearrayoutputstream(), new mocklambdacontext());}

下面的实验结果基于使用 lambda 函数在 1 小时内以 1024 mb 内存设置重现超过 100 次冷启动和大约 100.000 次热启动。为此,我使用了负载测试工具,但是您可以使用任何您想要的工具,例如 serverless-artillery 或 postman。

我用 4 种不同的场景进行了所有这些实验:

码上飞 码上飞

码上飞(CodeFlying) 是一款AI自动化开发平台,通过自然语言描述即可自动生成完整应用程序。

码上飞 138 查看详情 码上飞

1) 未启用 snapstart

在 template.yaml 中使用以下配置:

    handler: org.springframework.cloud.function.adapter.aws.functioninvoker::handlerequest          #snapstart:         #applyon: publishedversions      

我们需要调用名为 getproductbyidwithspringboot32scf 的 lambda 函数,该函数映射到 getproductbyidhandler lambda handler java 类。

2) snapstart 已启用,但未应用启动

在 template.yaml 中使用以下配置:

    handler: org.springframework.cloud.function.adapter.aws.functioninvoker::handlerequest     snapstart:      applyon: publishedversions 

我们需要调用名称为 getproductbyidwithspringboot32scf 的相同 lambda 函数,该函数映射到 getproductbyidhandler lambda handler java 类。
3) 通过 dynamodb 调用启动启用 snapstart

在 template.yaml 中使用以下配置:

    handler: org.springframework.cloud.function.adapter.aws.functioninvoker::handlerequest        snapstart:      applyon: publishedversions      

并且我们需要调用名为 getproductbyidwithspringboot32scfanddynamodbrequestpriming 的 lambda 函数,该函数映射到 getproductbyidwithdynamodbrequestpriminghandler lambda handler java 类。

4) snapstart 通过 api 网关请求调用启动/代理启用

在 template.yaml 中使用以下配置:

    Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest    SnapStart:      ApplyOn: PublishedVersions      

我们需要使用名称调用 lambda 函数
getproductbyidwithspringboot32scfandwebrequestpriming 映射到 getproductbyidwithwebrequestpriminghandler lambda handler java 类。

缩写c代表冷启动,w代表热启动。

冷 (c) 和热 (w) 开始时间(以毫秒为单位):

场景编号 c p50 c p75 c p90 c p99 c p99.9 c 最大 wp50 w p75 wp90 wp99 w p99.9 w 最大

未启用 snapstart4768.344850.114967.865248.615811.925813.317.168.139.5321.7562.001367.52已启用 snapstart,但未应用启动2006.602065.612180.172604.692662.602663.547.458.409.9223.091354.501496.46通过 dynamodb 调用启动启用 snapstart1181.401263.231384.901533.541661.201662.177.578.7310.8323.83492.37646.18通过 api gateway 请求调用启动启用 snapstart855.45953.911107.101339.971354.781355.218.009.5312.0926.31163.26547.28

结论

通过单独在 lambda 函数上启用 snapstart,可以显着减少 lambda 函数的冷启动时间。通过另外使用 dynamodb 调用启动,我们能够实现的冷启动仅略高于我的文章 aws snapstart -measuring cold and warm start with java 21 using different memory settings(我们在其中测量了纯 lambda 的冷启动和热启动)中描述的冷启动无需使用任何框架(包括 1024mb 内存设置,如我们的场景中)即可运行该功能。

比较我们在使用 aws serverless java container 测量冷启动和热启动和使用 aws lambda web adapter 测量冷启动和热启动一文中使用 aws serverless java container 测量的冷启动时间和热启动时间,我们发现 spring cloud function 提供了更高的冷启动时间与 aws lambda web adapter 相比,但冷启动时间与 aws serverless java container 相当(结果因百分位数而略有不同)。就热启动/执行时间而言,特别是考虑低于 99.9 的百分位数时,所有 3 种方法都具有相当可比的结果。

以上就是AWS Lambda 上的 Spring Boot 应用程序 – 使用 Spring Cloud Function 测量冷启动和热启动部分的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/497429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
开发php工具有哪些
上一篇 2025年11月8日 18:39:47
梦的第七章氪金攻略总汇-梦的第七章怎么氪金最划算
下一篇 2025年11月8日 18:39:49

相关推荐

  • XML的DOM的DocumentFragment有什么用?

    documentfragment通过批量操作dom节点显著提升页面性能。它作为内存中的虚拟容器,允许开发者在不触发重绘和回流的情况下构建或修改节点结构,待所有操作完成后一次性插入文档。相较于逐个添加节点会引发多次渲染,使用documentfragment可减少浏览器的计算压力。其与普通元素节点不同之…

    2025年12月17日
    100
  • XPath的string()函数转换规则是什么?

    要提取特定元素的文本内容,可使用string()函数。对于给定html片段,提取div全部文本的方法是string(//div[@class=’content’]),结果包含所有后代文本节点;若只想提取p标签内文本而不包括a标签,则使用string-join(//div[@c…

    2025年12月17日
    100
  • XSLT的document()函数怎么加载外部XML?

    xslt的document()函数用于加载外部xml文件数据。1. 它通过xpath表达式调用,传入uri参数,返回外部xml文档的节点集;2. 典型用法包括整合多源数据、配置与查找表、模块化与重用以及处理大型xml文档;3. 路径解析支持绝对路径和相对路径,但需注意部署环境差异;4. 错误处理需检…

    2025年12月17日
    100
  • XML的DOM接口中NodeList怎么遍历?

    nodelist的遍历核心是利用length属性和索引访问节点,最稳妥的方式是使用传统for循环;1. nodelist分为“活的”和“死的”两种类型,“活的”会随dom变化实时更新,常见于getelementsbytagname、getelementsbyclassname和childnodes,…

    2025年12月17日
    200
  • XSD的substitutionGroup如何实现元素替换?

    xsd的substitutiongroup机制通过元素替代实现xml文档结构的多态性,使某个元素能被其“家族”中的其他成员替代,同时保持schema验证有效。具体步骤为:1. 定义头部元素(如vehicle),作为通用接口;2. 定义替代成员元素(如car、motorcycle),它们必须是全局元素…

    2025年12月17日
    100
  • XML的SAX解析器如何处理开始标签事件?

    sax解析器在开始标签事件中能提供uri、localname、qname及attributes四个关键信息。1. uri表示命名空间uri,用于区分不同命名空间下的同名标签;2. localname是不带命名空间前缀的本地标签名;3. qname是包含命名空间前缀的完整标签名;4. attribut…

    2025年12月17日
    000
  • XSLT的key()函数如何建立节点索引?

    xslt的key()函数通过预索引机制提升xml节点查找效率。1. 使用xsl:key声明索引,定义name(唯一名称)、match(匹配节点)、use(键值来源)属性;2. 在模板中调用key()函数,传入索引名和查找值,快速获取对应节点集。它解决了xpath//操作符在大型文档中重复遍历导致的性…

    2025年12月17日
    000
  • XQuery的validate表达式如何校验文档?

    xquery的validate表达式用于根据xml schema校验xml数据是否合规,其核心作用是确保数据结构和内容符合预期。它提供两种验证模式:1. strict模式要求数据完全符合schema定义,任何不匹配都会导致错误;2. lax模式仅验证schema中明确定义的部分,忽略未定义的内容。v…

    2025年12月17日
    100
  • RSS的item元素的guid有什么作用?

    guid在rss中的核心作用是为每个条目提供唯一标识以实现去重、更新追踪和稳定识别。具体包括:1.去重防漏:聚合器通过记录已处理的guid避免重复显示相同条目;2.内容更新追踪:当内容小幅修改但guid不变时,阅读器能识别为同一内容的更新而非新条目;3.作为永久链接:默认ispermalink=&#…

    2025年12月17日
    100
  • XPath的namespace轴在什么情况下使用?

    xpath的namespace轴关键在于处理带命名空间的xml/html文档,通过注册前缀与uri映射实现精准定位。1. 命名空间用于避免元素冲突,如book:title与cd:title属不同空间;2. xpath中直接使用前缀会失败,因需通过namespace context明确前缀对应uri;…

    2025年12月17日
    000
  • XSLT的apply-templates选择节点有哪些方式?

    xslt中apply-templates选择节点的方式主要有两种:1.通过select属性指定xpath表达式精准选择节点;2.不指定select属性时默认处理当前上下文的所有子节点。此外,结合mode属性可实现对相同节点的不同处理逻辑。使用select属性时,xpath表达式可以是相对路径、绝对路…

    2025年12月17日
    100
  • XSLT的mode属性在模板中起什么作用?

    xslt中的mode属性通过为模板提供“模式”概念,使同一xml节点在不同模式下可被不同模板处理。1. 定义模板时,在xsl:template上使用mode属性,如mode=”summary-view”或mode=”detail-view”,以区分不同…

    2025年12月17日
    000
  • XML的DOM的Attr接口有哪些属性?

    xml dom中的attr接口暴露了name、value、specified和ownerelement四个核心属性。name是只读字符串,表示属性名称;value是可读写字符串,用于获取或设置属性值;specified是布尔值,指示属性是否在文档中明确指定;ownerelement指向拥有该attr…

    2025年12月17日
    000
  • XLink的show属性有哪些可选值?

    xlink的show属性用于定义链接资源的展示方式,主要有五个值:new、replace、embed、other和none。new表示在新窗口打开;replace表示替换当前内容;embed表示将资源嵌入当前文档;other由应用程序自定义行为;none则不预设任何显示行为。相比html的targe…

    2025年12月17日
    000
  • XSL-FO的block-container如何定位内容?

    block-container在xsl-fo中用于创建独立布局上下文以实现高级定位和局部排版控制。1. 它为内部元素提供新的坐标系,支持绝对定位,允许子元素相对于容器进行left、top等属性的精确定位;2. block-container可设定width、height、边距等属性,与主文档流分离,…

    2025年12月17日
    000
  • XSD的restriction元素如何限制简单类型?

    xsd中restriction元素用于对简单类型进行约束,通过刻面限制值域。常用刻面包括:1.length、minlength、maxlength限制长度;2.pattern使用正则定义格式;3.enumeration限定可选值;4.mininclusive/maxinclusive等定义数值范围;…

    2025年12月17日
    000
  • XSLT的number元素如何格式化序号?

    xslt的number元素通过format、level、count等核心属性实现灵活的序号控制。1. format定义输出格式,如1、a、a、i、i及混合格式;2. level指定计数级别,包括single(默认)、multiple(多级编号)和any(全局连续计数);3. count设定要计数的节…

    2025年12月17日
    000
  • XSD的key和keyref如何定义数据关系?

    xsd中key和keyref机制用于定义xml文档内部数据的唯一性和引用完整性,其核心在于通过唯一键(key)和引用键(keyref)确保数据一致性。1. key用于定义唯一标识符,由selector指定目标元素集,field指定构成唯一值的属性或子元素,确保所选范围内该值全局唯一;2. keyre…

    2025年12月17日
    000
  • SOAP消息的Envelope元素有什么作用?

    soap消息的envelope元素是整个消息的根元素,它定义了消息的结构、协议版本和扩展性。1.envelope必须包含body元素,header为可选;2.通过xmlns:soap属性指定soap版本,如soap 1.1或soap 1.2;3.header用于传递元数据,如安全信息、路由信息等,并…

    2025年12月17日
    000
  • XML如何定义别名机制?

    xml没有官方的“别名机制”,但通过命名空间、实体引用和schema的ref属性实现了类似功能。1.命名空间通过前缀绑定uri,避免元素名冲突,如soap:envelope中的soap是uri的别名;2.实体引用通过定义通用或参数实体实现内容复用,如用&copyright;代替固定文本;3.…

    2025年12月17日
    100

发表回复

登录后才能评论
关注微信