排查处理一个不熟悉的项目中的问题

简介: 作为一个开发,不见得所有技术都能掌握,但问题往往也不会出现在自己能掌握的知识里,那怎么才能有效率的解决问题呢?接下来分享一下自己面对这种情况时候的表现。

背景

部门有一个基于xmpp 协议使用tigase框架实现的im 服务。三月初接到了一个问题反馈,说该用户的一个游戏角色,在手机端收不到来自游戏的某一种消息。该账号下的其他角色却可以。由于对技术项目都不了解,又因为有高优先级的事儿也是个例,就一直没处理。直到清明节假期来临之际,来自游戏反馈暴露出问题的严重性。


排查

是一个im 服务,里面多线程,队列,锁,线程池,代理等技术用到的比较多。所以不同于正常的web程序单个线程处理完一个任务。而在这个架构中,从接收到消息,到投递给目标用户,一条消息其实走了很长时间,被多个线程处理,难以捉摸。

脑子一头雾水,不知所措。

这个时候不妨静一静,想一下现有的现象,从日志入手,反推一个消息到底经历了什么。

im服务比较活跃,老旧服务日志因性能考虑打的也不多,只能捕捉到几个点,还是找不到具体的切入点。一时有种拔剑四顾心茫然的感觉。


思路

这时,公司来了个新员工,富有经验的工程师,给我带来了新的思路,就是先要对技术有一定的了解。不是从问题出发,而是带着问题了解这个技术。然后就找到了相关的源码博客拿来看,自己还是不能直接看源码来看懂。虽然自己找到了启动类,可对自己还不很自信。先找到服务启动入口

xmppservermain// 启动入口,之后会创建两个对象privatestaticMessageRouterIfcrouter=null;
config= (ConfiguratorAbstract) Class.forName( config_class_name ).newInstance();
config.init( args );
privatestaticConfiguratorAbstractconfig=null;
Stringmr_class_name=config.getMessageRouterClassName();
router= (MessageRouterIfc) Class.forName( mr_class_name ).newInstance();

以上两个对象其实会将配置读到内存中,之后通过反射创建相关的组件。组件配置文件/conf/config-comp.properties

--comp-class-1=tigase.muc.CYMUCComponentClustered--comp-name-1=muc--comp-class-2=cyoujia.gametl.ComponentTL--comp-name-2=game-tl--comp-class-3=cyoujia.publicaccount.ComponentPub--comp-name-3=public-account--sm-cluster-strategy-class=tigase.cluster.strategy.OnlineUsersCachingStrategy--sm-plugins=-domain-filter,-jabber:iq:private,-jabber:iq:privacy,-presence,-amp,-message-carbons,-jabber:iq:roster,-jabber:iq:register,+msgoffline,+message=16,+message-gametl=16,+roster-cyj,+roster-tl,+urn:xmpp:blocking,presenceForward,im:cyj:form

已知到了如此多的组件被加载到服务中,就在代码中具体看各个组件实现了些什么。在了解到一个+urn:xmpp:blocking 组件又被加载到服务中,具体了解其业务其实是im中黑名单的功能,对消息处理时判断消息发出方与接收方是否存在拉黑的标识存在。

为什么要会关注这个组件呢。因为其中有个SessionManager类来管理消息在发送方与接收方之间的流转,而SessionManager中规定了四种处理机制preProcessor,processor,postProcessor,filter。在排查的过程中,组件分别实现这四种能力,其中黑名单组件的filter 功能就是判断接收方是否对发送发进行了拉黑。

查到了这样的线索后,查找代码,定位数据库,查库中数据,确定该用户手机端的接收方对游戏中的该角色拉黑了,其实很难解释会出现这样的问题,自己手机端拉黑了游戏端自己的角色。导致一直无法接到自己该角色的消息。执行解除拉黑的sql,重启服务重新构建单机缓存。

让用户尝试得到成功解决问题的反馈,哈哈哈哈,虽然用了一个半月的时间为这个用户解决了这个问题,但也还是有所成长,内心有所满足。

后记

线上还是时不时有大面积的用户反馈无法进行该功能,因为当时是跟同事一起排查,我们各自按照自己关注的现象排查,开始以为殊途同归,但是我排查的这个用户太特殊了,肯定在隐匿的角落有些我没触碰到的点。经过细致排查还是被我逮到了。嘿嘿。

不过我们的服务还是存在问题,想要彻底挽救服务的问题,还是要对服务整体有更深层次的了解,还是需要投入一些时间的。

总结下来就是要投入一些时间带着问题了解自己不懂的技术,然后通过既有的线索,抽丝剥茧直达病灶,逐步培养自己解决问题的能力,了解底层知识,构建自己的知识框架,才能在遇到问题时有信息解决问题。

相关文章
|
5月前
|
SQL 网络协议 Java
Java开发者的必备技能:抓包工具排查问题
Java开发者的必备技能:抓包工具排查问题
274 0
|
4天前
|
数据挖掘
【杂学笔记甲】问题分析和解决的流程及工具介绍
【10月更文挑战第2天】该文档详细介绍了问题解决的过程,包括定义问题、测量问题、分析问题、改善问题和控制问题五个阶段。在定义问题阶段,通过组建跨职能团队和运用4W1H方法明确问题;测量问题阶段则通过逻辑图和流程图等工具进行数据分析;分析问题阶段筛选关键原因并确认;改善问题阶段提出并筛选方案,进行试运行;最后控制问题阶段实施前后对比并总结经验,为后续挑战做准备。
34 11
【杂学笔记甲】问题分析和解决的流程及工具介绍
|
1天前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
7 1
「测试线排查的一些经验-中篇」&& 调试日志实战
|
1天前
|
Java 测试技术 程序员
「测试线排查的一些经验-上篇」&& 后端工程师
「测试线排查的一些经验-上篇」&& 后端工程师
7 1
|
5月前
|
SQL Oracle Java
java开发常见错误及其解决方式
java开发常见错误及其解决方式
|
5月前
|
存储 移动开发 安全
【Linux技术专题】「必备基础知识」带你仔细梳理一下平时排查问题查询日志的基本操作和指令
【Linux技术专题】「必备基础知识」带你仔细梳理一下平时排查问题查询日志的基本操作和指令
174 0
|
11月前
|
小程序 IDE 开发工具
小程序从零开始开发到上线的过程
小程序从零开始开发到上线的过程
149 0
|
前端开发 Java API
如何使用线上环境进行本地代码调试
如何使用线上环境进行本地代码调试
507 0
|
XML 缓存 前端开发
【解决方案 十一】问题排查方法的思考
【解决方案 十一】问题排查方法的思考
103 0
|
Oracle IDE Java
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
395 0
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)