摘要
2014年12月,本人所在的深圳市XX科技有限公司启动了一个销售过程管理系统的开发项目,本人作为IT部门程序组经理,担任了此项目的系统分析师角色。该系统主要用户为销售和售前技术人员。为销售人员提供项目机会的创建、项目机会跟进的功能。为售前技术人员提供项目机会协助支持功能。本文论述了为了提高可靠性常见的各种技术和方法,在软件容错层面COP系统主要采取的防卫式软件设计具体应用,以及在采用这些技术和方法时,如何平衡开发成本与满足高可靠性需求,及如何兼顾实时性要求。文章最后总结了采用这些方法的实际效果。
正文
项目背景
本人所在的深圳市XX科技有限公司是一个本土的电子元器件分销企业,主要业务为代理销售来自欧美、日本20多个品牌的电子元器件,公司有10多个办事处,200多业务员及60多个技术支持人员分布在全国各主要城市。 公司主要业务模式为将国外品牌的电子元器件通过项目协同设计的方式分销给国内的制造企业及设计公司。销售过程管理是公司核心业务流程。2014年12月,公司着手销售过程管理系统(内部名称为COP系统)的开发。该系统定位于公司内部客户服务人员的协同作业平台,主要用户为销售和技术人员。系统为销售人员提供 项目机会的创建、项目机会跟进、项目机会转化功能。而对于技术人员,如何鼓励他们更多更好地服务有价值项目同时避免资源过度集中,以实现公司整体价值最大化正是本系统着重要解决的问题。本人有幸在该项目中担任系统分析师,全程参与了该系统的需求分析、架构设计、系统开发及上线工作。项目历时4个月,于2015年4月正式上线。
可靠性要求
COP系统作为全公司所有销售和技术人员的客户服务协作平台,管理整个销售过程,公司领导对此系统非常重视,要求所有销售项目、销售机会必须及时录入系统管理,系统数据绝对不容丢失,除提前公告的系统停机维护外,系统要求7*24小时正常运行。为此我们除了硬件上采用双机热备,数据库文件存放在raid5的磁盘阵列中,磁盘阵列与数据库服务器间采用双光纤通道连接外,软件上我们也作了一些特别的容错设计来提高系统的可靠性。
提升软件可靠性常用方式介绍
为了提高软件可靠性,核心是要软件容错,业界常用的方法主要有N版本程序设计,恢复块方法及防卫式程序软件,N版本程序设计思路为对于同一个功能模块,,由不同的团队基于相同的需求不同的设计独立开发出几个版本,各自验证OK后,在系统中用一个表决器组装起来,程序运行时,由表决器比较各个版本执行的结果,一般采用多数通过的方式,得以将某个偶然出现的错误屏蔽掉,这种方法实时性非常高,实现代价也最大,一般只应用在核心的,可靠性要求特别严格,出错可能导致灾难性后果的模块。 恢复块方法是首先设计好几个备用块,类似Plan A, Plan B, Plan C, 首先执行Plan A代码块,然后执行验证程序,如果验证不通过,则执行Plan B代码块,依次类推直到找到满意结果为止。由于需要验证结果然后后执行恢复块,可能要执行多个恢复块,故实时性比N版本程序设计稍差一些。这种方法对验证模块的正确性要求非常高,实现代价也比较大。防卫式程序设计则是另外一种思路,在程序中检测到错误后,不是启用另外一个模块重新计算或者同时计算几个模块表决出一个正确的结果,而是将程序往前回退到一个正确的状态,以便后续外部环境修复后重新处理。这种方法实现较容易,代价也比较小。适合实时性要求不是那么高的系统。因为我们这套COP系统作为企业内部使用的业务系统,对数据安全可靠性要求比较高,对系统实时性要求不是太高,同时考虑到开发成本,故我们主要在如下几个地方采用了防卫式程序设计。
具体采用的提升可靠性方法
一、审批模块,审批模块是一个独立的构件,负责将请求来源模块提交的审批请求提交到后台数据库系统,提供展示页面内容给主管审批时参考,记录审批结果并将审批最终结果反馈给审批请求来源。在将审批结果反馈这个环节,考虑到请求来源模块可能存在临时性故障,比如数据库锁,通信中断,模块代码更新异常等导致审批模块审批已经完成,而来源模块没有接收到审批结果的情形。所以我们在这个地方做了一个防卫式设计,在反馈请求来源模块审批结果后,再次检查来源模块审批结果是否成功接收,如果判断接收成功则审批模块成功结束,如果不成功则将审批结果回退到未审批的状态,让审批人有机会下次重新审批。
二、公共池模块,在公共池模块中,有一个场景是技术部门主管在查看下属公共池领养情况时,可以将一个成员已经领养的销售机会重新指派给另外一个成员。我们设计的做法是,先让原成员自动执行弃领过程,再让新成员自动执行领养过程。这里就有一个风险,就是旧成员弃领成功后,新成员执行自动领养时可能各种原因领养不成功,所以我们这个地方也加入了一个防卫式设计,就是新成员领养后,判断是否成功能领养,如果不成功,则将该销售机会让原成员重新领回。
三、数据同步模块,COP系统中有很多地方需要与外部系统做数据同步,比如项目资料需要从COP系统同步到电商平台,电商平台是我们公司独立的一个平台,集网站、APP一体,数据库是Mysql数据库,Mysql数据库与COP系统所用的Oracle数据库属于异质数据库,不能用常规的事务处理方式保证数据一致性与完整性。我们设计的方案是,首先借用透明网关从Oracle服务器建立一个DB Link到Mysql 数据库,然后在Oracle数据库端建立一个定期执行的同步过程,该过程中先将待同步的项目数据取出,标识为同步中状态,同步到电商平台后,做防卫式判断是否同步成功,同步成功后再将数据状态标识为已同步,如果不成功,则将数据恢复为待同步的状态。
实际效果
项目成功上线后系统可靠性非常好,得到使用单位用户和领导的高度认可,系统使用至今已经超过1年,基本上没有异常停机过。维护工作量也比较少,维护工作内容基本上为功能改善性维护,极少数据修正维护。虽然系统没有采用实时性更高的N版本程序、恢复快方法,但是由于系统在采用防卫式设计时配合及时的信息反馈,让用户第一时间知晓系统监测到的错误,得以及时联系相关部门同事处理,故用户对系统实时性感受还是不错的。
总结
通过这个项目本人也学到了很多,不仅加深了对系统可靠性设计的理解,同时也意识到系统可靠性的提高不仅能够提高用户对系统的满意度,更能大大减少后期系统维护的成本。