我的 DEBUG 血泪史 第一篇

事故回顾

背景介绍

有一个服务F, 下游接了很多个其它服务,S1, S2,...。所有请求通过 F 到达下游服务 Si, Si 处理请求后结果通过 F 返回给用户。 F 根据不同的请求类型将请求发送至下游的一个或多个服务模块。我们有新的服务要接入,因此在 F 的下游新接入了一个服务 Sk,该 Sk 与其它服务没任交集,也就是 Sk 与其它下游服务之间不会产生任何影响。但是就是新增加的这个服务 Sk 上线出了大问题了。

事故回放

  1. 添加新服 Sk 后开发与测试阶段一切正常,开发环境与测试环境都正常工作;
  2. 上线至首个机房首台时,验证功能时发现其服务正常但新添加的服务 Sk 没有返回任何数据,原有服务一切正常;
  3. 登录至首台查看日志,日志显示好像调度了下游其它服务【事实上并非如此】;
  4. 查检 conf 文件中 Sk 的配置,发现确认 Sk 的配置正常,与线下一致;
  5. 怀疑上线线版本并非测试版本,进行测试环境 bin 文件与上线 bin 文件的MD5值对比;
  6. 二进制文件 md5 值一致,说明提测版本与上线版本相同,此时进入懵逼状态,不知道从何查起;
  7. 向老大汇报后,老大指示将首台的 data, conf 等目录依次拉取到线下进行对比。用线上目录覆盖线下目录查看服务状态;
  8. 替换了线上的conf目录后复现线上问题,而 conf 中唯一的区别:线上配置的下游个数比线下的下游服务个数多。这是因为,线下为了方便将有一些不必要的下游服务注释掉了。
  9. 我们注释掉其中一个服务(非Sk),此时发现新服务正常了,这就奇怪了。事实上当时根本没有意识到会是服务个数导致的,现在想来在这一环节就应该发现下游服务数目这个问题
  10. 回去查代码,发现框架定义最多允许 16 个下游服务,而我们新添加的服务是第17个服务,导致新的服务加载失败。但是代码里并没有输出任何日志,导致没有意识到数量的限制,从而这样被坑了一个下午。
  11. 删除一个暂时不用的下游服务再次上线,最终一切正常。

总结

回顾这个过程,主要有以下几点经验值得铭记。

  1. 通过对比查找问题。
    当出现这种在某些场景下正常,其它场景下异常的情况。最简单有效的方式就是两种场景进行 DIFF 比较。本次事件发生时,我是处理彻底懵逼状态,完全不知道为什么,找不到原因也不知道从何下手找原因。幸好老大及时让我进行线上与线下的对比,从而才能一步一步地找到问题的所在。
    对比过程中有两点要注意:一个应用或者说服务,除了运行的代码外,其配置文件,所需有的其它资源文件都是它的一部分,不能只关注在代码本身。我在思考的时候就一直纠结于思考代码哪儿出错了,而没有把注意力从代码上移开关注配置文件。其次,不要把一切想的理所当然。这次查找问题的过程中, 我就理所当然的以为新加一个服务就新加一个配置,并且配置是正确的,那就没什么问题。但是我却忽略了资源数的影响,从而定位问题在conf中后却立刻意识到资源数量的限制。
  2. 尽量保持线下与线上的一致。
    其如果线下与线上配置一致的话,问题在开发阶段就应该能发现了。就是因为我在开发环境里面删除了许多用不上的服务导致没问题没有暴露出来。实际上,在给QA部署测试环境的时候,这个问题就暴露过一次。当时QA从线下拉下服务,并用提测的版本覆盖线上拉下来的程序(仅bin文件 )时,我就发现程序启动就不能调度我的下游服务。但是当时我觉得很可能是QA环境有问题,就草率地把 F 的其它一些下游服务配置也给删除了。这样服务就OK,最后导致上线的时候才又一次暴露出这个问题。虽然很多时候由于很多人并发开发,不断地有人上线,要想保证线上与线上完全一致也是很难的,但是提测的时候还是尽量保证其一致性,否则再出这种坑,很难找。
  3. 代码加载服务的坑
    不得不说 F 服务代码里面的坑了。F 在加载下游服务配置时, 直接依次遍历配置中的所有下游服务配置,并加载到一个数组中,这个加载循环使用的是配置的个数做限制。而数组的长度也就是允许的最大服务数是固定的,所以啊当配置的服务个数超过这个限制时就出现了内存泄露的问题,不过在本此事故中并没有因此出core。但是, 框架没有任何提示信息说明配置的下游服务超出允许的最大个数了,导致了这个问题这么难查。正确的写法应该是使用数组长度做循环结束条件,发现配置个数超了过后直接报错,这样也就容易追查问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,702评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,290评论 25 707
  • “喂,麒麟,你这话让人家好伤心呐。人家可是在帮你唉……”林红袖委屈的看了刘云帆一眼。 明知道她是在演戏,可这眼神仍...
    飄雲阅读 450评论 0 1
  • 从小觉得世界上最厉害的人就是妈妈 不怕黑 什么都知道 做好吃的饭 把生活打理得井井有条 可我忘了这个被我依靠的人也...
    阿诺_Don阅读 397评论 0 0
  • 前几天有事住在亲戚家里,恰逢我姨哥想做个花架,于是我们几个找来材料,又是写又是画,光图就画了好几张,可是到头来还是...
    惠影风华阅读 250评论 0 1