Apollo配置修改后为啥应用就重启

2024-05-06  本文已影响0人  emperorxiaomai

首先,Apollo是一个配置管理系统, 可以简单了解下。
配置中心:Apollo入门了解 - 知乎 (zhihu.com)
本身使用它的目的就是可以让线上的程序可以在不发布的情况下,做一些形为的更改。普遍用于灰度上线功能,开关等。我们遇到的问题是,当配置修改后,5~10分钟左右应用就会内存爆满,被容器Kill,重启。
由于配置本身修改不频繁,而且本身是一个定时任务的程序,就没有高优的处理该问题;也让团队内的同学排查过,结果都没找到具体的原因。
这两天五一假期前,有点时间自己去排查了一下。结果发现是一个低级错误引起的。
原因是,针对一个单独的业务模块 自定义了一个复杂实际的配置项,通过监听Apollo的变更事件的方式,来触发该复杂实体的反序列化。本身事件添加Listener是期望在类初使化的时候做。这里使用了Spring的@PostConstruct注解。
然而这个方法是Public的,程序员偷懒,在业务代码中也调用了该方法。随着应用上线线时间的增加,最终导致监听器数量逐渐累积,每天大概增加25W次。也就是说,一旦配置变更,该监听器会被执行十万甚至百万次,最终CPU资源耗尽,内存耗尽。应用被Kill,重启。
本身是一个低级的错误,而且测试环境没有线上的业务量,不能重现。只有沉下来看代码才能发现问题。当然,没有了上帝视角,可以从表象上去定位。比如,监听器的方法调用量为什么被调用那么多次,近而一步一步的找到root case.
很多时候我们都在权衡一个事情的,优先级,处理一个问题的代价。避开公司投入,处理这种问题才是对个最有帮助的。

上一篇下一篇

猜你喜欢

热点阅读