首先,Apollo是一个配置管理系统, 可以简单了解下。
配置中心:Apollo入门了解 - 知乎 (zhihu.com)
本身使用它的目的就是可以让线上的程序可以在不发布的情况下,做一些形为的更改。普遍用于灰度上线功能,开关等。我们遇到的问题是,当配置修改后,5~10分钟左右应用就会内存爆满,被容器Kill,重启。
由于配置本身修改不频繁,而且本身是一个定时任务的程序,就没有高优的处理该问题;也让团队内的同学排查过,结果都没找到具体的原因。
这两天五一假期前,有点时间自己去排查了一下。结果发现是一个低级错误引起的。
原因是,针对一个单独的业务模块 自定义了一个复杂实际的配置项,通过监听Apollo的变更事件的方式,来触发该复杂实体的反序列化。本身事件添加Listener是期望在类初使化的时候做。这里使用了Spring的@PostConstruct注解。
然而这个方法是Public的,程序员偷懒,在业务代码中也调用了该方法。随着应用上线线时间的增加,最终导致监听器数量逐渐累积,每天大概增加25W次。也就是说,一旦配置变更,该监听器会被执行十万甚至百万次,最终CPU资源耗尽,内存耗尽。应用被Kill,重启。
本身是一个低级的错误,而且测试环境没有线上的业务量,不能重现。只有沉下来看代码才能发现问题。当然,没有了上帝视角,可以从表象上去定位。比如,监听器的方法调用量为什么被调用那么多次,近而一步一步的找到root case.
很多时候我们都在权衡一个事情的,优先级,处理一个问题的代价。避开公司投入,处理这种问题才是对个最有帮助的。
Apollo配置修改后为啥应用就重启
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 起因 你是否碰到过如下场景: 在测试环境未发现的BUG,上了生产环境之后偶现,但同样由于缺少调试信息,无法定位问题...
- 关键字 :Apollo源码、apollo-configservice模块 上一篇文章 Apollo 原理分析[ht...
- 导读 本篇文章适用于对Apollo有一定使用经验或者一定了解的人群 关键字 :Apollo源码、apollo-cl...