系统维护在软件生命周期中,持续时间最长的工作。处理生产环境系统上的运维问题,几乎成了每位开发人员的必修课。
当碰到问题的时候,我们如何高效地、快速、一针见血地去处理和解决,是值得我们思考的问题。
当然,影响效率的,还有开发人员对系统的熟悉程度、对业务的熟悉程度、自身的沟通处理和协调能力和环境等客观因素。
本文只是对通用的方法进行经验性总结。
- 确定是否真的是系统有问题,还是用户操作问题
有时候用户反馈系统不可用,不一定是系统问题,可能是用户操作失误或者用户不会操作,导致系统无法使用,这个是首先需要排查的,从最表层看起,对问题也能先有个全局的了解。在很多公司,如果是操作类的问题,往往技术支持或者业务运维人员就能处理得了,很多时候都流转不到开发人员这里。
当然,有的时候为了避免技术支持太粗心或者没有准确判断到问题所在,抑或是有的公司压根就没有技术支持人员,所以这个步骤,也是开发人员处理问题的时候,首先需要确定的。
- 在测试环境、本地环境能否重现
排除了不是用户操作的问题,而且凭借自己的业务经验和技术经验,不能一眼看出问题所在,这个时候,要做的,就是看看本地(测试)环境,能否重现这个问题,如果能够重现,很幸运,基本上调试一下就能发现问题的原因了。
- 排查部署问题
如果在本地和测试环境都正常,而且最近时间内刚好上线了新功能,这个时候很有可能是部署的时候,出现了问题,例如生产环境部署的代码和配置不正确,没有部署到最新的代码,如果有多个负载,甚至有可能是有些负载是正常的,有的负载是部署有问题的。
如果部署出现问题,往往是开发、运维人员粗心大意、或者是部署工具不可靠造成,往往出现在多机部署的分布式环境中。
- 排查数据问题
数据问题,其实是最难的一个问题。
数据是系统的血液,在排错的过程中,由于测试环境和生产环境数据不一致,到时很多问题无法排查。有的公司会构建一个“模拟环境”,定时从生产环境还原一份数据到“模拟环境”,方便调错。
而且如果是数据问题,很多时候会牵扯很复杂的业务流程,甚至出现问题的地方,往往不是问题的根源,需要经过长期,综合的分析,才能找出问题,为了找到问题,有时候还需要在系统关键的地方写个日志,用来跟踪问题的原因。
对于这种问题,开发者在开发的过程中,一方面要保证代码质量,另外一方面要多记日志,留有后手,方便日后调错。
- 排查并发问题、性能问题
如果是面向公众用户的系统,而且用户量比较大,并发比较大,这个时候,有的问题,往往是因为并发导致。有可能因为并发引起脏读、脏写。这种问题需要重现的话,代码需要很好的支持单元测试和要求要有比较好的测试体系。
- 排查网络因素、CDN、缓存、客户端兼容性等运行环境因素
系统的客户端、服务端运行环境不一致,或者网络抖动,也可能会引发系统问题。对于服务端环境网络问题,需要有一套网络监控体系,看看发生问题的时间节点,网络是否正常。
如果网页前端方面的问题,有时候会是浏览器缓存或者CDN缓存引发的问题,当然,也有可能是浏览器兼容性问题(我不是专业的)。
如果说的不对请大伙指正,如果大伙有更好的方法和经验可以分享出来。