背景
部门有一个基于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,重启服务重新构建单机缓存。
让用户尝试得到成功解决问题的反馈,哈哈哈哈,虽然用了一个半月的时间为这个用户解决了这个问题,但也还是有所成长,内心有所满足。
后记
线上还是时不时有大面积的用户反馈无法进行该功能,因为当时是跟同事一起排查,我们各自按照自己关注的现象排查,开始以为殊途同归,但是我排查的这个用户太特殊了,肯定在隐匿的角落有些我没触碰到的点。经过细致排查还是被我逮到了。嘿嘿。
不过我们的服务还是存在问题,想要彻底挽救服务的问题,还是要对服务整体有更深层次的了解,还是需要投入一些时间的。
总结下来就是要投入一些时间带着问题了解自己不懂的技术,然后通过既有的线索,抽丝剥茧直达病灶,逐步培养自己解决问题的能力,了解底层知识,构建自己的知识框架,才能在遇到问题时有信息解决问题。