首页 > 解决方案 > 如果 JVM 使用 JIT 编译器,为什么基于 Java 的无服务器函数会冷启动?

问题描述

周五深夜阅读有关 Cloudflare 基于 v8 的“无冷启动”Workers 功能的材料后的想法——简而言之,由于 V8 引擎的 JavaScript 代码即时编译器——我想知道为什么这种无冷启动类型无服务器功能似乎只存在于 Javascript 中。

这仅仅是因为当 AWS Lambda / Azure Functions 推出时,它们在架构上被设计为一种更加简化的 Kubernetes 模型,其中每个函数都存在于自己的容器中?我认为这是一个更简单的模型,可以将不同客户的代码分开,而不是在引擎盖下提供的任何魔术酱 v8 隔离。

因此,鉴于 Java 被编译为 JVM 的字节码,它使用 JIT 编译(如果它不优化并编译为机器代码某些高使用功能),因此在技术上是否也可以没有冷启动 Java 无服务器功能?只要有某种方法可以在调用每个客户端的字节码时将其加载到云提供商的服务器上。

实现这一目标的实际挑战是什么?我不是这一切的专家,但也许可以想象:

  1. 编译后的字节码并非旨在以这种方式加载 - 它预计是在 JVM 中执行的唯一代码
  2. JVM 优化不是为了支持加载短暂的、多个函数而编写的,并且将所有加载的代码视为一个庞大的程序
  3. JVM 启动后不支持加载额外的字节码。

标签: aws-lambdajvmazure-functionsserverlesscloudflare-workers

解决方案


原则上,您可以开发一个以 Java 为中心的无服务器运行时,其中各个函数按需动态加载,并且您可以通过这种方式实现相当好的冷启动时间。但是,这可能不如 JavaScript 好用有两个重要原因:

  1. 虽然 Java 是为 JIT 编译而设计的,但它并没有像 V8 那样针对启动时间进行优化。今天,JVM 最常用于大型永远在线的服务器,其中启动速度并不那么重要。另一方面,V8 一直专注于在用户等待时下载和执行代码的浏览器环境,因此最小化启动延迟至关重要。(看看像 Android 的 Dalvik 这样的替代 Java 运行时可能真的很有趣,它有更多理由优先考虑启动速度。也许它可以成为真正快速的 Java 无服务器环境的基础!)
  2. 安全。V8 和其他 JavaScript 运行时从一开始就在设计时考虑了恶意代码,并且对它们进行了大量的安全研究。Java 在很早的时候也试图通过“小程序”来解决这个问题,但 Java 的这种用法从未流行起来。如今,安全沙盒并不是 Java 的主要关注点。因此,在同一个容器中运行多个互不信任的 Java 应用程序可能风险太大。因此,您将重新为每个应用程序启动一个单独的容器。

推荐阅读