时下,移动互联网时代中,完成原始用户积累已经明显比过去更为容易,也更加轻松。在这个过程中,用户体验问题也成为了最具讨论价值的话题之一。对于企业而言,即便你拥有再厉害的产品,也需要有非凡的用户体验,才能长久的留住用户。
哪怕是“业界唯我独大”的12306网站,也需要与时俱进,不断优化用户体验,才能保住自己的“江湖地位”。而在后移动互联网时代,软件工程师需要和硬件工程师共同配合,才能保证服务的稳定性和可靠性。基于此,今天,我们就和大家一起探讨一下,能为企业节省巨额成本的软件稳定性的相关内容。
1、为什么要维护产品的稳定性?
如果说良好用户体验是软件用户增长的基础,那么稳定的使用体验和流畅的操作性就是用户体验的基础。只有维护好产品的稳定性和流畅性,才是留住用户的王道,也是为企业节流的潜在做法。
然而,随着我们服务的用户量日增,服务复杂程度提升,我们的系统为了实现可维护,也会在业务架构和系统架构上进行调整。这也是为什么微服务架构会盛行的原因。使用微服务架构时,的确会帮我们提升系统的可维护性,当然,也会有弊端,那就是企业维护成本骤增。
另外,不少产品运行要求:集群化部署、分散服务、稳定性运行。
事实上,无论是硬件故障、网络异常、资源异常、其他依赖异常、配置异常等,任何一种情况出现,都会打破原有的平衡导致稳定性问题的出现。这也是为什么软件稳定性被破坏的场景非常多的原因。加之,复杂的稳定性演进过程中,又有很多场景出现,这样交织的变化对分布式系统测试,也给软件测试工程师在测试软件稳定性方面,带来了巨大的挑战。
2、那么,什么是系统稳定性?
顾名思义,它是指系统要素在外界影响下表现出的某种稳定状态。
那么如何衡量系统稳定性的高低呢?通常情况下,一个常用的指标就是服务可用时长占比,占比越高,说明系统稳定性也越高。
举个栗子:如果我们拿一整年的数据来看,常见的4个9(99.99%)意味着,我们系统提供的服务,全年的不可用时长只有52分钟!
它其实是一个综合指标,为什么这么说?因为我们在服务可用的定义上会有一些差别,常见的服务可用包括:服务能正常触发、服务响应时间低、服务有效(逻辑正确)、服务无异常,等。
3、如何维护产品稳定性?
1)找出故障来源
日常情况下,系统出现故障的原因主要包括两类。一类是人为因素,另一类是自然因素。那么,人为因素可能有哪些呢?大家可以看看下面这张图片
人为因素一般是可控的,但需要事先避免。在工作中,很多软件不稳定性都会出在认为因素这一块,因此,软件测试人员需要在测试前,对整件事情抽丝剥茧,剥离掉这些影响因素。
下面说说自然因素。
自然原因导致的故障可大可小,虽然无法避免,但由于没有第一责任人,避免了“人性拷问”,测试工程师可以和运维部、安全部的同学协作起来处理故障。
2)稳定性的处理逻辑
基于笔者的工作经验有限,下面给大家提供一些思考的方向和思路,大家可以结合自己工作的场景,去尝试。
● 失败后是否重试,重试了几次;
● 通过定时检测发送告警,运维介入修复,查看是否存在消息堆积、资源不足等问题;
● 定时巡检,拉起或修复;
● 结合业务量冗余情况,通过某些方式限制访问量;
● 非关键配置不强制检验,使用默认值或忽略输出错误信息;
● 异常数据容错,使用默认值;
● 预取、缓存一些内容,提升业务响应速度;
● 异常或并发、批量操作合理性;
● 资源不足可以通过比较动态方式交互提醒、做预判断;
此外,对于日志、备份数据和其他数据,测试人员要考虑到回滚,设置清理机制等,避免数据堆积和漏测。有的还需要考虑到数据持久化(重启不丢失)问题。
3)测试软件稳定性的工具
下面给大家介绍一些可以测试软件稳定性的工具。由于笔者涉猎的比较少,欢迎大家随时补充内容。
● 网络质量设置工具:iptable
● cpu跑高工具:stress、sysbench
● io跑高设置工具:fio
● 内存:memtester
● openstack环境使用的网络性能测试工具:shsker
写在最后
不知道大家在日常工作中,是否遇到过因为产品稳定性不足,导致产品在使用过程中出现崩溃的事故呢?