假如我们从 kafka 拉取数据然后生成任务处理数据,在服务退出时,如何保证内存中的数据能被正常处理完不丢失呢?假如服务是部署在 Kubernetes
中又该如何处理?
Java 应用优雅停机
我们首先考虑下,一般在什么场景下数据会丢失呢?
- 升级服务时
- pod重启时
- 服务器断电时
因为服务器断电属于极端情况,我们暂且不考虑。那就只有 Java 退出时我们要保证数据的完整性了。在 Java 中,有一个方法可以实现应用退出时候的优雅停机:shutdown hook
。Spring boot
把这个东西封装了一下,可以通过 @PreDestroy
注解实现。当 JVM
收到退出的信号时,会调用 shutdown hook
中的方法,完成清理操作。示例代码如下:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Start to run shutdown hook.");
}
})
Shutdown h