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

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

背景

部门有一个基于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,重启服务重新构建单机缓存。

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

后记

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

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

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

相关文章
|
4月前
|
SQL 网络协议 Java
Java开发者的必备技能:抓包工具排查问题
Java开发者的必备技能:抓包工具排查问题
|
7月前
|
Dubbo Java 应用服务中间件
项目中引进这玩意,排查日志又快又准
随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候,因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。
|
2月前
|
存储 移动开发 安全
【Linux技术专题】「必备基础知识」带你仔细梳理一下平时排查问题查询日志的基本操作和指令
【Linux技术专题】「必备基础知识」带你仔细梳理一下平时排查问题查询日志的基本操作和指令
21 0
|
10月前
|
Java API 容器
java项目排查bug
java项目排查bug
92 0
|
11月前
|
XML 缓存 前端开发
【解决方案 十一】问题排查方法的思考
【解决方案 十一】问题排查方法的思考
81 0
|
安全 IDE 搜索推荐
安卓开发从源码看后端技术——搭建环境与断点调试
今天就让我们开启源码共读的篇章吧,希望这不同的眼界探索可以在这截然不同的领域会有所收获,为自身技术带来启发。
291 0
|
Oracle IDE Java
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
277 0
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
|
IDE 程序员 Go
如何借助工具快速生成代码?初学者容易踩的坑有哪些?
这篇内容继续分享重点内容:如何借助工具快速生成代码?初学者容易踩的坑有哪些?
129 0
如何借助工具快速生成代码?初学者容易踩的坑有哪些?
|
前端开发 测试技术
软件测试面试题:如何分析一个bug是前端还是后端的?
软件测试面试题:如何分析一个bug是前端还是后端的?
75 0
|
测试技术
如何处理不能复现的bug?软件测试工程师避坑指南
软件测试工作中常常会遇到不能复现的bug,遇到这种情况其实很正常,但是很多测试新手都按照自己的想法处理,没有提交bug,或者匆匆关闭bug。线上出现问题,就只能自己背锅了。
320 0