领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多以下是 Spring Cloud Function 在 AWS Lambda 上内存与计费的最新图表。它显示了计费指标 GBsec 作为 Lambda 中内存分配的函数,用于两个自定义运行时,一个使用纯 Java,另一个使用GraalVM 原生镜像,如最近Andy Clement 在此博客中所述。
在这两种情况下,功能都是相同的(一个简单的 POJO 到 POJO 函数),并且它们都只显示冷启动的结果。暖启动(在请求到达时函数已处于活动状态)速度更快且成本更低(除了最小的内存设置外,所有函数的成本都相同,因为 AWS 对所有函数都有最低收费)。您可以看到原生镜像启动非常快,并且比常规 JVM 运行成本低两倍多。最快的启动是在 1000MB 容器中 - 应用程序启动仅需 19 毫秒,但 AWS 准备容器需要 700 毫秒,因此计费为 800 毫秒。实际上,所有原生镜像的冷启动都计费为 800 毫秒。对于常规 JVM,最快的启动也在 1000MB 容器中,为 300 毫秒,但计费为 2200 毫秒。
为了比较,这是我一年多前在 Spring Cloud Function 发布 2.0 版本时发布的类似图表。它显示了与 1.x 版本相比的重大改进,并且还具有我在这里再次使用的自定义运行时(因此橙色条与上图中的红色条等效)。
常规 JVM 中的自定义运行时在 3.x 版本中大致相同,但您可以以较低的内存设置使用它,因为从那时起已发布了 Spring Boot 优化。
示例应用程序取自Spring Graal Native 功能,但已修改为 POJO 到 POJO 的函数,迫使 Spring 做一些额外的工作。因此,与 Github 中的示例相比,我修改了函数
class Foobar implements Function<Foo, Foo> {
@Override
public Foo apply(Foo input) {
System.err.println("HI: " + input.getName());
return new Foo("hi " + input.getName() + "!");
}
}
其中 Foo
定义如下
class Foo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Foo(String name) {
this.name = name;
}
Foo() {
}
}
并在主应用程序中注册函数
@Override
public void initialize(GenericApplicationContext context) {
context.registerBean("foobar", FunctionRegistration.class,
() -> new FunctionRegistration<>(new Foobar())
.type(FunctionType.from(Foo.class).to(Foo.class)));
}
请注意,我正在使用函数 Bean 注册样式,尽管对于如此简单的应用程序而言,这并没有太大区别。
我还必须修改测试以确保它们与新的 POJO 签名一起使用。如果您只想快速使用,则可以删除测试和 verify.sh
以避免执行此操作。如果您想了解我做了什么,请查看我 fork 中的foo 分支。
然后我以与其他示例相同的方式构建了应用程序。这会创建原生镜像并将其转储到 target
目录中
$ ./build.sh
它还会创建一个 .zip
文件以上传到 AWS。这是一个常规 JVM 版本
$ ls -l target/*.zip
-rw-rw-r-- 1 dsyer dsyer 32577121 Apr 21 09:37 target/function-aws-0.0.1-SNAPSHOT-java-zip.zip
然后这会为原生镜像创建一个 .zip
文件
$ ./mvnw package -P native
$ ls -l target/*.zip
-rw-rw-r-- 1 dsyer dsyer 32577121 Apr 21 09:37 target/function-aws-0.0.1-SNAPSHOT-java-zip.zip
-rw-rw-r-- 1 dsyer dsyer 26284838 Apr 21 09:28 target/function-aws-0.0.1-SNAPSHOT-native-zip.zip
使用 Spring Cloud Function 是一种开发在 AWS 和其他平台上运行的函数的非常方便的方式。如果您还使用实验性的 Spring Graal Native 功能项目将结果编译为原生二进制可执行文件,则它们可以比常规 JVM 上的相同应用程序运行得更快。请注意,在 Spring Graal Native 功能项目中还有另一个示例,它将函数转换为独立的 Web 应用程序(该示例也有函数 Bean 注册版本)。您可以在许多允许您“自带容器”的平台上运行它。