JVM 检查点恢复
TODAY Framework 与 Project CRaC 实现的检查点/恢复集成,以允许实现能够减少基于 Infra 的 Java 应用程序在 JVM 上的启动和预热时间的系统。
使用此功能需要:
-
启用了检查点/恢复的 JVM(目前仅限 Linux)。
-
类路径中存在
org.crac:crac库(支持版本1.4.0及以上)。 -
指定所需的
java命令行参数,如-XX:CRaCCheckpointTo=PATH或-XX:CRaCRestoreFrom=PATH。
当请求检查点时,在 -XX:CRaCCheckpointTo=PATH 指定的路径中生成的文件包含正在运行的 JVM 的内存表示,其中可能包含机密和其他敏感数据。使用此功能时应假设 JVM“看到”的任何值(例如来自环境的配置属性)都将存储在这些 CRaC 文件中。因此,应仔细评估生成、存储和访问这些文件的位置和方式的安全性影响。
|
从概念上讲,检查点和恢复与单个 bean 的 Infra Lifecycle 契约 一致。
正在运行的应用程序的按需检查点/恢复
可以按需创建检查点,例如使用 jcmd application.jar JDK.checkpoint 之类的命令。在创建检查点之前,Infra 会停止所有正在运行的 bean,通过实现 Lifecycle.stop 给它们一个关闭资源的机会(如果需要)。恢复后,相同的 bean 将重新启动,Lifecycle.start 允许 bean 在相关时重新打开资源。对于不依赖于 Infra 的库,可以通过实现 org.crac.Resource 并注册相关实例来提供自定义检查点/恢复集成。
| 利用正在运行的应用程序的检查点/恢复通常需要额外的生命周期管理,以优雅地停止和开始使用资源(如文件或套接字)并停止活动线程。 |
| 如果在预热的 JVM 上创建检查点,则恢复的 JVM 将同样被预热,从而可能立即获得峰值性能。此方法通常需要访问远程服务,因此需要一定程度的平台集成。 |
启动时的自动检查点/恢复
当设置了 -Dspring.context.checkpoint=onRefresh JVM 系统属性时,会在启动期间的 LifecycleProcessor.onRefresh 阶段自动创建检查点。此阶段完成后,所有非延迟初始化的单例都已实例化,并且已调用 InitializingBean#afterPropertiesSet 回调;但生命周期尚未开始,并且尚未发布 ContextRefreshedEvent。
出于测试目的,还可以利用 -Dinfra.context.exit=onRefresh JVM 系统属性,该属性触发类似的行为,但不是创建检查点,而是在相同的生命周期阶段退出您的 Infra 应用程序,而不需要 Project CraC 依赖项/JVM 或 Linux。这对于检查在 bean 未启动时是否需要连接到远程服务很有用,并可能优化配置以避免这种情况。
| 如上所述,尤其是在 CRaC 文件作为可部署工件(例如容器镜像)的一部分发布的用例中,请假设 JVM“看到”的任何敏感数据最终都会出现在 CRaC 文件中,并仔细评估相关的安全影响。 |
| 自动检查点/恢复是一种将应用程序启动“快进”到应用程序上下文即将启动阶段的方法,但它不允许拥有完全预热的 JVM。 |