故事的开头,是一个深夜, 窗外漆黑一片,屋里灯火通明。
办公室里,寸头短发的IT男们列坐两边,中间一两个妹子分外显眼。
空气里充斥着紧张的气氛,大家紧锁眉头,盯着电脑,表情异常严肃,深更半夜,这群人是谁,在干嘛?
原来他们是长亮科技大数据团队驻扎在民生银行信用卡项目的一组程序猿,负责该项目的闵工回忆起当时的场景仍记忆犹新:
2020年4月,我们的项目团队接到了民生银行卡中心的紧急需求——在2020年6月16日上线中国民生银行信用卡中心梦想值引擎项目。
梦想值是啥?说白点就类似于积分的作用,用户在民生银行信用卡APP中通过做任务可以获得梦想值,再用梦想值兑换商品。而我们负责的这个梦想值引擎项目主要为梦想值提供服务接口、数据处理,保证梦想值账务的正确性。
大家掐指一算,这工期满打满算也只有1.5个月!而且这个项目对稳定性、扩展性、性能等方面要求都非常严格,同时要求7X24小时线上运行,真的是时间太紧了,任务太重了!
怎么办?在长亮科技技术宝宝的字典里就没有“不可能”这仨字儿,那就撸起袖子加油干吧。
本来一切都在紧张有序的推进中,感觉尽在掌握,直到民生银行信用卡测试团队进行集成测试。
那是6月10日,民生测试团队发现有时梦想值未能正常调增。
看到这个现象,我心里咯噔一下,做这行,大家都知道梦想值的正确性是整个项目的根基!如果在生产上出现该问题,很难在短时间内解决,后果将十分严重!
但距离项目正式上线只剩6天,我的心紧绷起来,心里只剩下一个念头,一定要快速找出原因,解决这个问题!
但这个BUG最大的问题不在于它有多难解决,而在于它是偶然性的,会不会复现、什么时候复现都不知道,根本无法准确定位。
我们项目组立即开会,向测试团队了解测试场景,猜测可能的各种原因。
老韩说:会不会是网络问题,网络有抖动?
老刘说:是不是上游提供消息有遗漏或者消费消息有错误?调整梦想值出现问题?
云云说:会不会是redis什么地方出现了问题?
还有人猜测kafka、mysql、hbase或……出现什么问题?
你一言我一语,经过一番最大化的发散讨论后,我们达成一致,考虑到BUG的不确定性,决定采用虽然最耗时但却是最稳妥的排查方案,从最源头开始逐步分段进行排查,分析各种日志及监控源码。于是便出现了开头的那一幕,大家都在紧张地进行排查,严阵以待,寻找BUG所在。
时间一分一秒过去,凌晨1点,项目组基本定位了问题来源,原来是因为同一账号相关的多条消息放入kafka,在调用调增接口后,第一条消息获取redis锁后短时间不释放,而其他消息跳过等待期直接返回,导致这些消息丢失。
定位了问题,大家心里都稍微松了一口气,但丝毫不敢懈怠,立即分头行动,云云用自己半吊子的英文加上翻译软件开始翻英文版的redis官方手册,老刘、老韩则分头查找redis锁机制、锁原理,锁控制实现代码,大家紧密配合。
凌晨3点,云云终于从官方手册找到解决方案。我们将源代码修改(将redis锁的等待时间设置为10s,将锁的超时时间设置为20s)并自测完成后,立即提交行方专业测试团队,最终回归测试成功,BUG完美解决,直到这一刻,大家悬着的那颗心才真正落了下来。
奋战一晚,我们却困意全无,心中充满了苦战一场、大获全胜的痛快,离开项目组已是凌晨4点多,新的一天即将到来。
6月16日,终于迎来了该项目成功上线,不仅完美顶住了616活动峰值压力,也展现出了优越的性能,我们项目组获得了行方相关领导的高度表扬,对我们来说,这不仅是对长亮科技项目服务能力的认可,更是对我们长亮人拼搏精神的一种认可!
后续:
后来小编再次问闵工,在这次事件中,让他印象最深的是什么。他说:那肯定是我们的组员齐心协力,共同战胜困难的样子呀,那一刻大家没有一个人有情绪、有抱怨,忘记时间、忘记疲倦,只是单纯地奔着问题、解决问题,这也是大家最美的样子……
柴静在《看见》里面曾说:“每一个微笑的背后,都有一个咬紧牙关的灵魂。”