1、摘要:
我就职于一家在线教育互联网公司,公司为了深耕中、小学的教学资源消费市场,决定在 2017 年3月份决定升级一款教学资源搜索与下载产品,“*校通”。我有幸作为该产品系统架构师,负责了系统架构工作。本文以该产品升级的可靠性设计为例,论述了软件可靠性设计的过程:首先,对产品的开发特点进行分析与回顾主流的可靠性设计技术,其次
分析了可靠性设计要求,确定了采用容错设计技术、检错技术满足系统运行的可靠性。最后,重点论述了几余设计、防卫式程序设计、检错技术的应用过程。事实证明,正是采用合适的、正确的可靠性设计技术保障了产品上线后的运行稳定。该产品历经7 个月时间于 2017 年 10 上线,上线之后系统的稳定运行与良好的用户体验得到了用户的一致好评。
2、正文:
我就职的企业是一家在线教育互联网公司,公司是国内较大、较权威的 k12 领域的教学资源提供商之涵盖全学科的试题、试卷、学案、教案等各类教学资源 700 多万套。公司为了深耕中、小学的教学资,源消费市场,要能够吸引更多的学校用户,计划在 2017 年3月份决定升级一款教学资源搜索与下载产品“*校通”。该产品由用户中心、资源网站、资源定制与推荐、资源评价等子系统构成,在历经了7个月的开发后,于10月上线,至今为已有运行半年,良好的用户体验与产品的稳定运行,得到了广大学校的一致好评。公司任命本为系统架构师,负责了该产品的系统架构工作。软件的可靠性设计,是系统架构的核心工作之一,它的设计合理性直接决定着系统的稳定性,保障了系统运行的质量。
在可靠性设计之前,对产品升级的开发背景进行了解:首先,产品上线后运行 4年多的时间,在此期间有多次的功能性完善维护,虽然整体运行稳定,但错误也会偶尔出现,系统的可靠性程度有所下降。其次,该产品历经了多个开发团队维护,代码质量差,系统的扩展较差,已不能满足扩展性需求开发。最后为了能吸引更多的学校用户,需要对现有产品功能进行较大调整,同时又新增了不少需求。在了产品升级开发背景后,召开了产品项目会议,决定对该产品重新开发,同时提出对产品进行架构设计,由其提出了系统运行稳定要求,保障系统的可靠性。
在架构设计期间,可靠性的要求是较为明确的,系统的核心模块运行可靠性要有保障。因此我们回顾主流的软件可靠性设计技术:(1)容错设计技术:是应用程序所运行的软件或硬件中发生的错误并从错误中恢复所采用的设计技术,主要包括:恢复块设计、N版本程序设计、几余设计、卫防式程序设计等,它的设计要求,要有错误自我修复的能力;(2) 检错技术:是建立软件系统查错机制,对程序中模块进行监控,一旦超过设定的闹值或检测到错误发出报警通知负责人处理错误,主要包括:漏洞扫描、记录日志等,它的设计要求,要有系统监控与预警错误的能力;(3)降低复杂度设计:通过简化软件结构,缩短程序代码,优化软件数据流向,降低软件复杂度,从而提高软件可靠性,它的设计要求,系统的程序实现是简单的、尽量降低复杂程度。在回顾了主流的软件可靠性设计之后,我们重点的分析了核心功能可靠性设计要求,例如:资源搜索、资源预览、资源下载、扫码支付等这些核心功能,要有错误的修复能力,因此决定采用容错设计技术实现这些功能运行可靠性。另外,要实现系统的错误预警处理,能够对系统出现的异常、错误进行收集与处理,因此决定采用检错技术实现系统监控。
在明确了采用容错设计技术、检错技术的可靠性设计技术后,我们开展了系统的可靠性设计工作。在设计过程中让我印象较深的几余设计、防卫式程序设计、检错技术的技术应用,下面将着重阐述在可靠性设计过程中这些技术具体应用过程冗余设计,包括结构冗余设计、信息几余设计等,我们在开发过程中主要使用是信息几余设计,是防止动态产生的数据丢失的问题。在设计记录用户操作日志时,我们使用消息队列技术临时存储这些数据,在消息队列中的数据,按着先进先出的策略插入到日志数据库中,这样能够防止对数据库高并发操作。而在消息队列中的数据是单点的,一旦消息队列中失效,其中的数据也会丢失。因此,在消息队列接收数据后,在将这些数据存储到消息数据库中,防止消息队列的失效而造成的数据丢失。在设计资源搜索功能我们将最新、较热的资源数据存储到 Redis (内存数据库)中,用户在搜索资源数据时,只在 Redis 中搜索数据,这样能够提升搜索的效率。而一旦内存溢出,将会导致 Redis 中的数据失效。因此,在数据存储到 Redis的后,在将这些数据存储到搜索数据库,防止 Redis 的失效而带来的数据丢失。在几余设计的过程中,让我体会较深的要对动态产生数据要进行冗余存储,防止数据丢失。
防卫式程序设计,主要用于系统在运行过程可能出现的错误,做出防卫式的程序设计,将出现的错误自动修复。资源下载功能是产品核心功能之一,会员在下载资源时,需要扫描资源金额的二维码,完成支付后才能下载资源。在实现该功能时,需要对接公司的支付中心,在扫描二维码时,需要调用支付中心的接口,将消费信息发送至支付中心,由支付中心完成支付过程,根据支付是否成功的结果决定资源能否下载。为了让用户能够不会因支付失败而导致资源无法下载,我们对该功能进行防卫式程序设计,在调用支付中心的接口时,将消费信息记录在应用端的消费数据库中,一旦支付中心出错,会从消费数据库中读取数据,轮询的向支付中心发送消费信息,同时向支付中心的运维管理员发送短信通知处理问题。正是通过这样的可靠性设计,防止了因支付中心错误而导致的资源下载失败。在防卫式程序的过程中,让我体会较深的是要在设计过程要有风险意识,对会出现的问题做好防卫式程序设计。
检错技术,主要对系统进行监控,一旦超设定闯值或检测到错误发出报警通知负责人处理。了为了能够及时的发现错误,我们为系统设计了一套的监控子系统,能够监控功能异常的处理情况、错误日志。为了实现这些监控服务,首先,在程序中加入了异常处理,对功能异常进行捕获与处理,同时异常进行记录,例如,资源下载、扫码充值、资源预览等核心功能加入了try/cath 代码块;其次,我们封装了错误日志监控组件,这些组件调用集成到各主要程序模块中,收集系统运行过程的出现的错误,例如,null 值、对象不存在、返回值无效等错误。正是通过构建了监控子系统,让我们能够了解系统运行情况,一旦监控到异常、错误时,系统会发短信通知负责人处理问题。在检错技术的应用过程中,让我体会较深的是设计要在系统监控那些功能点,但不是全面监控,而是重点监控。
在历经了7个月的开发,“*校通”的升级产品于在 2017 年10 月上线。上线之后我们通过调查问卷热力图分析与市场的销售的反馈,得了用户的一致好评。正是对系统进行可靠性设计,为产品升级后的新系统提供了运行保障。通过此次产品的升级开发,让我对可靠性设计,有了更深刻的认识,懂得了要对系统中产生核心业务数据做好信息几余设计、在设计过程要有风险意识并做好防卫式程序设计、构建监控系统来检找系统运行的错误。正是此次开发工作,让我对可靠性设计,有更多知识储备并积累了可贵的经验对我今后的工作有很大帮助。