2021年6月,我参与了某司电商平台系统项目建设,该项目旨在提升用户购物体验,提升优质的售后服务,配合运营开展营销工作,提高用户转化率。该项目的业务功能模块主要包括订单、活动、售后、用户、支付等。在项目中我担任系统架构设计师,主要负责系统架构设计相关工作。本文以该电商平台项目为例,论述软件可靠性设计与应用,以及遇到的问题和解决方案。一方面我们通过冗余设计结合负载均衡技术,增加了系统的容错能力,提高系统可靠性;另一方面我们通过层次架构风格,对系统进行分层,层次结构清晰,每层职责明确,降低了复杂度设计;此外我们还对系统中的异常进行处理,发生严重异常时,通过发短信或邮件预警方式,及时通知技术人员进行处理。最终项目顺利上线,系统运行稳定,得到了领导和同事的一致好评。
正文
2021年6月,我参与了某司电商平台系统项目建设,该项目旨在提升用户购物体验,提供优质的售后服务,配合运营开展营销工作,提高用户转化率。该项目的业务功能模块主要包括订单、活动、售后、用户、支付等。订单模块主要负责订单预览、订单生产、订单查询等业务;活动模块主要服务于运营人员,运营人员通过配置不同类型的促销活动,比如优惠券、秒杀活动、拼团活动等,开展营销工作,增加引流,提高用户转化率;售后模块提供了退货订单的统一管理功能,方便用户退货退款,保证了售后服务质量。

随着公司业务的不断发展,用户规模越来越大,交易量逐年攀升,系统的稳定性、可用性、可靠性得到了公司重视,为此公司提出了对电商平台系统项目进行升级改造。在项目中我担任系统架构设计师,主要负责系统架构设计相关工作。该项目原本采用单体架构,各种业务功能堆叠在一套代码中,造成了业务耦合性强,复杂度高,不易于后期维护。此外原系统中虽然也对代码进行了分层,但层次职责不够清晰,例如业务逻辑层与数据层耦合度过高,不能灵活地访问各种数据库,增加了编码复杂度,降低了系统的可靠性。为了提高系统可靠性,我们梳理了业务流程,划分业务模块,选取架构风格等一列保障软件可靠性设计工作。
目前软件可靠性设计技术主要有容错设计、检错设计和降低复杂度设计等技术。其中容错技术是指系统出现故障时,它能够自我修复,从而持续对外提供服务的能力。常用的容错技术主要有恢复块设计、N版本程序设计和冗余设计。恢复块设计就是选择一组操作作为容错设计单元,从而把普通的程序块变成恢复块,一个恢复块包含有若干功能相同、设计差异的程序块文本,文本之间互为备份,当某个文本出现故障时,可用备份文本替换,从而构成动态冗余。N版本程序设计的核心是通过设计出多个模块或不同版本,实行多数表决,防止某一版本的故障提供错误的服务,以实现软件容错。冗余设计是在一套完整的软件系统之外,设计一种不同路径、不同算法或不同实现方法的模块或系统作为备份,在出现故障时可以进行替换,从而维持软件系统的正常运行。检错技术是系统出现故障后及时发现并预警,其缺点是不能自动修复故障。降低软件复杂度设计是因为软件的复杂性与软件可靠性有着密切的关系,软件复杂性是产生软件缺陷的重要根源,在设计时考虑降低软件的复杂性,是提高软件可靠性的有效方法。

本文以该电商平台系统为例,从冗余设计、降低复杂度设计和检错设计三个方面,论述软件可靠性设计与应用,以及遇到的问题及其解决方案。
冗余设计技术主要有双机热备技术和服务器集群技术,其中双机热备技术有双机热备模式和双机互备模式。在本项目中,我们使用服务器集群技术来保证系统提供高可靠的服务,并结合了Nginx负载均衡技术,当某个节点服务器发生故障时,这台服务器上运行的应用程序将被另一台服务器自动接管。此外为了避免Nginx服务器单点故障,提高系统可用性,我们通过了引入了KeepLived开源工具,keeplived是轻量级别的高可用解决方案,它通过虚拟路由冗余协议实现服务的高可用,具有服务健康检查和故障自动转移两大功能。它可以检测到不健康的服务并将其从集群中剔除,当服务正常恢复后又可将其加入到集群中。这样通过部署两台Nginx服务器互为备份,当主Nignx服务出现故障后,会自动激活备份的Nginx服务器,继续提供服务,从而保证了系统的可靠性。
软件越复杂,代码的可维护性越差,也不便于测试,这样就会容易增加软件缺陷率,影响了系统的可靠性。在降低软件复杂度方面,我们首先选取了架构风格,系统采用了层次架构风格,并借鉴领域驱动设计思想,将层次划分为接口层、应用层、领域层、基础设施层。接口层主要面向外部实体,提供访问该系统的统一入口和通信协议;应用层是一个协调的作用,其上层是接口层,接收来自接口层的调用,并进行业务流程编排,调用领域层提供的业务逻辑服务,实现定制的业务功能;领域层是整个系统的业务核心层,其承担着主要的业务逻辑,在编码过程中,通过抽象业务逻辑,使用设计模式等方式,提高代码的可复用性;基础设施层提供了统一访问外部实体的能力,比如访问数据库、消息中间件和其他服务等,使访问外部实体更加透明,例如在更换数据库时,其他层不需要做任何的代码改动或者改动性很小,提供了强大的公共服务基础能力,从而保障了软件质量。另外,领域层主要承担业务逻辑服务,我们可以针对该层设计更高标准的单元测试,使得软件缺陷率大大降低。
检错技术核心在于对系统异常处理并及时通知技术人员排错,也是提高软件可靠性的一个重要保障。在异常处理方面,我们首先定义了日志等级,分为debug、info、warn、error级别,在编写代码时要求严格按异常严重程度输出不同的日志级别,这样不仅有助于快速排错,而且针对严重的错误,可以通过短信或邮件预警方式让技术人员及时介入。在接口层,为了统一处理外部实体访问异常,我们采用了面向切面编程的方式,通过对所有的Controller接口编织统一的异常处理机制,当新增接口时,无需考虑异常的处理,减少了开发人员的重复劳动时间,让开发人员更加专注于业务代码的开发,提高了代码质量。此外服务之间进行交互时,为了隔离服务异常之间的影响,我们还增加了防腐层,在该层可以进行异常处理、降级等操作,保证了本服务的可用性,提高了服务的质量。
2022年6月,项目顺利上线,系统运行稳定,用户日活量40万到100万人次,有力地支撑了公司业务的高速发展,获得了领导和同事的一致好评。在开发过程中,我们发现采用的轮询负载均衡算法,出现资源调度不合理的现象,最终通过使用最小连接算法,解决了这一问题。
实践证明,我们使用了冗余设计、降低复杂度设计、检错设计等技术,提高了系统的可靠性。