论系统可靠性设计
目录
摘要
该平台系统是一站式全网整合活动平台系统,帮助中小微企业智能发展,提供全方位的营销活动管理服务。
本论文结合作者的实践,讨论了软件可靠性设计的实际应用。首先概述了活动平台项目及架构,其次为了满足架构阶段提出的可靠性要求,分析了影响软件可靠性的主要因素,并介绍了软件可靠性设计的基本原则,最后分析提出的可靠性要求结合常用的可靠性设计方法,基于基本原则制定并实施了提高可靠性的措施,大大提高了平台在各重要及敏感环节可靠性,提高系统的质量及用户体验。通过合理的软件可靠性设计,经过6个多月设计与实现,系统在发布后得到用户好评与团队的认可,并持续迭代,累计C端用户两千多万。
正文
项目背景
移动互联网时代,用户对活动需求持续增长,但活动供应与需求信息不对称,公司决定研发综合性活动平台(以下简称为:“平台”),为中小微企业提供活动组织发布服务,同时为用户提供更丰富的活动搜索服务。
项目概述
平台初期我们采用层次架构,结合SOA的架构风格,使用REST相关技术将通用模块、业务模块服务化,将平台分为应用层、服务层、数据层。根据用户角色不同,我们将应用层主要分为网站群、活动管理系统、活动搜索服务应用(涉及PC、公众号、App、小程序)、运营管理系统、工具服务系统等;由服务层为应用层提供业务逻辑服务,除了用户管理、订单支付管理等公共服务外,我们还将不同的类型的活动作为一个独立的服务,比如报名活动、预约活动、投票、抽奖、小游戏等;数据层提供数据的持久化、缓存、搜索访问。
考虑到平台倾向于移动端用户,且围绕微信生态,出于快速迭代快速验证的目的,采用成熟的lanmp体系,基于阿里云ecs集群及SLB负载均衡服务,在框架上选择了ThinkPHP框架、使用redis cluster分布式缓存、数据库采用阿里云DRDS云数据库、前端资源打包到七牛云CDN、使用阿里云消息队列MQ实现消息异步等
可靠性设计及基本原则
提出了可靠性性要求
在架构评估阶段,对平台可靠性提出了要求,这里罗列部分:
- 1、用户编辑活动异常退出,内容不能丢失
- 2、活动参与用户要求真实有效避免僵尸用户
- 3、活动的实时参与要求平台出现故障不能超过10分钟;
- 4、要求用户提现要求稳定性高,避免用户产生不信任感
- 5、要求用户重要操作消息通知不丢失
可靠性是什么
系统的可靠性是系统在规定时间内及规定的环境条件下,完成规定功能的能力,也就是系统无故障运行的概率。为了保证系统的可靠性,需要对系统进行可靠性设计与管理。
可靠性基本原则
虽然软件可靠性设计技术与普通的软件设计技术没有明显的界限,但软件可靠性设计仍要遵循一些基本原则:
- 1、软件可靠性设计是软件设计的一部分,必须在软件的总体设计框架中使用,并且不能与其他的设计原则相冲突。
- 2、软件可靠性设计在满足提高软件质量要求的前提下,以提高和保障软件可靠性为最终目标。
- 3、软件可靠性设计应确定软件的可靠性目标,不能无限扩大化,并且排在功能度、用户需求和开发费用之后考虑。
可靠性设计
影响可靠性的主要因素
要提高软件可靠性,首先分析影响软件可靠性的主要因素,一般来说影响可靠性的因素有:
-
1、运行环境。
软件是建立在硬件、操作系统的基础上,并和很多中间件服务有关系,所以选择合适运行环境很重要。
-
2、软件规模。
软件规模直接影响时间和空间复杂度,复杂度达到一定界限,软件可靠性将大幅度下降。
-
3、软件内部结构。
一般来说软件内部结构越复杂,软件可靠性越低。
-
4、软件开发方法与开发环境。
不同的开发方法及过程,将影响到软件的细节,细节对可靠性的影响是显著的。
-
5、软件可靠性投入。
可靠性除了设计,还有管理、测试、评价,并贯穿于整个软件生命周期,这都需要再人力、财力等方面的投入。
可靠性设计方法
在了解和分析影响可靠性因素后,在遵循可靠性设计的基本原则下,我们采用了以下可靠性设计技术:
-
1、容错设计技术。
常用的容错设计主要有恢复块设计、N版本程序设计、冗余设计三种方法。在活动编辑我们采用了恢复块方法,支持前端临时草稿机制与后端持久化草稿机制,保证在功能异常或奔溃退出后,还能恢复最新活动内容;在活动参与验证方面,我们采用了N版本程序设计,服务优先使用阿里云人机验证方式,在该验证方式出现故障或其他意外原因后,自动切换到内部实现的前后端加解密与验签的方案,保证验证的可靠性;冗余设计是可靠性的一个重要技术,在平台部署方面,采用云服务器集群及SLB负载均衡,在数据层rds采用主备方案,在redis上采用cluster集群,保证数据层数据可靠性,在应用层数据配置上采用多层冗余缓存方案,在域名上也做了冗余处理,避免由于小概率的内容审核不严谨导致社交平台临时封禁,而影响系统分享服务。
-
2、检错技术。
检错技术能及时发现故障但不能自动修复故障,需要通知人工维护。我们在一些出现故障时暂时无法自动修复的重要环节,比如在检测到短信故障时及时通过钉钉、邮件通知相关人员,在提现环节增加异常检查,在异常超出给定范围将通知相关人员跟进排查解决,将所有服务抛出的异常记录到日志文件,每日定时检查分析,及时了解系统服务运行情况及及时发现问题解决问题。
-
3、降低复杂度设计。
复杂度超过一定界限意味着高耦合的可能性,在保证软件功能的基础上,简化软件结构。我们结合SOA的思想,将通用模块及业务模块服务化,降低耦合性,并在每个服务粒度上进行业务流程的优化及代码算法优化,通过提高每个服务的可靠性提高系统的可靠性。
可靠性设计贯穿软件工程整个生命周期,在每一次迭代过程中,我们都关注可靠性设计、管理、测试、评价。可靠性设计是保证系统质量的重要设计,通过软件可靠性设计,可以大大提升系统的可靠性,为用户提供高质量友好体验的可靠服务。
总结
项目经过内部多次版本迭代,最终在次年5月完成RC版本,并对外发布。由于可靠性设计的投入,平台运行稳定,出现异常或问题时,能够第一时间容错,并及时分析排查解决问题。经过2年多的发展,累计C端用户两千多万,得到用户的好评和团队的认可。通过本次理论与实践的相结合,我们更明白了软件可靠性在软件工程实际开发过程中的重要程度,我们应该把可靠性设计、管理、测试、评价运用到软件工程的各个阶段中,保证项目高可靠性。