摘要:
2019年8月,我作为系统架构设计师,在某市政府数字化集中文印项目中担任重要角色,负责整体架构设计与中间件选型。通过该项目,开启了政务数字化改革中公文文印服务网络平台建设最重要的一步,为后续其他行政单位文印业务数字化改革提供了样板作用。
本文以该文印项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该集中印务项目共有十几种不同的数据协议,使用解释器风格可以满足排版印制过程中协议兼容性需求。中间层对应用层的数据流转我们采用了独立构件风格中的隐式调用,这种风格主要用于降低系统间耦合度、简化软件架构,提高可修改性方面的架构属性。应用层我们采用了B/S的架构风格,统一解决政府文印项目中“专业操作度高、维护难”的问题。最终项目成功上线获得用户一致好评。
正文:
为迎接十四五规划,政府数字化深化改革的全面启动,政府文印领域从单一数字化到部门协同一体化,依托政务内网,建设公文文印服务平台,实现自身业务与政务办公业务的协同融合,提升服务效率,助力政务数字化改革,完成从单一文印角色向公文制作服务平台运维的角色转变。2019年8月,我作为项目负责人、系统架构设计师,在某市政府集中印务项目中担任重要角色。该项目为期1年,总投资约1200万人民币,通过该项目,开启了政务数字化改革中公文文印服务网络平台建设最重要的一步,为后续其他行政单位文印业务数字化改革提供了样板作用。该项目时间紧任务重,具有较强的挑战性。一是业务模式升级,按照最新的排版科与印制科需求,实现更高级别的安全权限控制,以及对印务流程进行工作流的改造。二是技术要求高,要实现集中印务系统的集群化处理、分布式部署,一旦服务失效需要在半小时内做到整体可用,同时满足性能需求。三是数据整合难,需要将上一代系统中历时数十年的数据,按其有效性进行分类、整合、转化,实现历史存续业务数据在新系统环境下,按照新模式正常运行。四是设计组织人员多,直接研发团队成员27人,内核组、中台组、web组、QA组、需求组、产品组及其他支持部门总计近70人。同时上游承接政务内网入口系统,下游承接印刷流程系统,涉及外部配合协作公文排版、设备厂商等多组织外协人员50余人。我作为主要技术负责人,负责项目整体技术方法评估、立项论证以及项目管理工作。在项目启动前,负责分析项目的预期经济效益、可选技术方案,分析关联项目影响,向公司提交立项报告。项目启动后,作为主要项目负责人,牵头与公司内部技术专家、外部架构师一同建立技术架构组,设计项目整体技术架构,同时挑选项目内部成员,建立需求分析组、系统开发组、系统测试组、运维支持组,开展业务需求分析、系统设计、数据迁移方案、上线切换方案工作。一方面,我个人接受各组工作汇报,指导团队研发工作,监控整体工作进度。同时,我及时向公司领导、项目客户方、相关项目团队汇报沟通工作进展、阐明关键技术点。
在架构工作开始阶段,我们便意识到,架构风格是一组设计原则,能够提供抽象框架模式,为我们的项目提供提供通用的解决方案,这种能够极大提高软件设计的重用方法加快我们的建设进程,因此在我司总工程师的建议下,我们使用了虚拟机风格、独立构件风格以及B/S架构风格这三种较为常见的风格。虚拟机风格中的解释器风格能够灵活的提供解析引擎,这类风格非常适用于复杂流程的处理。独立构件风格包括进程通信风格与隐式调用风格,我们为了简化架构复杂度采用了隐式调用风格,通过消息订阅与发布控制系统间信息交互,不仅能降低系统耦合度,而且还能提高系统架构的可修改性。B/S架构风格是基于浏览器和服务器的软件架构,它主要使用http协议进行通信和交互,简化客户端的工作,最终降低了系统推广和维护的难度,一下将重点描述架构风格的实施过程和结果。
底层架构我们使用解释器风格来满足政府文印多公文格式的兼容性需求,解释器风格是虚拟机风格中的一种,具备良好的灵活性。在本项目中我们的架构设计需要兼容等数十种公文排版格式,一般来说,这种软件编写难度非常高,代码维护难度压力也很大,因此这个解释器的设计任务便很明确了,软件设计需要高度抽象,文件格式的适配由配置文件来承担。具体的做法如下,我们对每种版式的排版流程进行了高度抽象,由于每种版式中由许多文档元素组成,每种文档元素样式相对固定并且穿插其中的数据有严格的规定,因此,我们将不同版式中的红头、公章、打号等元素进行建模,将整体文档格式作为一个根节点,分别下挂不同文档元素的id属性作为叶子结点,使用xml数据结构映射成了公文根节点-公文元素-公文子元素-数据内容这种层级数据结构,核心代码采用C++结合QT库实现,搭建一套可以基于可变模板的解释器,公文模板的产生可以由交由公司的需求文档由公司的专业排版人员得到。解释器支持公文模板的热部署与在线编辑,这种能够利用可变数据快速生成规范公文的方式,将排版的工作复杂度简化,可变数据只改变内容,文档格式确保统一规范。最终我们建立了用户需要使用的二十几套公文模板,规避了人员操作产生的异常格式问题,保证后续印制工作的顺利进行。
中间层我们使用独立架构风格中的隐式调用来简化构件的交互复杂度,降低系统耦合度。主要的实现手段是,我们采用了一个开源的消息中间件,这个构建是apache基金会下的核心开源项目activemq,它是一款消息服务器,其性能和稳定性经久考验。由上文提到的解释器解析出对象化数据经过activemq分发到各个订阅此消息的应用系统,这些应用系统包括,规范化处理器、折手处理器、拼版处理器、公章红头处理器等。这种多web应用的情况非常适合采用消息发布与消息订阅的机制,能够有效解决耦合问题,我们在编码过程中发现只要采用这种风格的web应用,整个迭代过程效率极高,错误率极低,而且我们使用的spring框架,消息队列的管理完全基于配置的,清晰简单,可维护性良好,例如针对规范化处理器任务繁忙,可以动态开启多个规范化处理器,极大提升任务流转效率而不用担心出错。不同的web系统监听的队列也可以随时变换组合,基于消息中间件的架构设计能让系统的构件化思路得到良好的实施,总体来说这种架构风格带来了清晰的数据流转架构,简化了编码难度,降低了本项目的二次开发难度。
应用系统层我们主要采用B/S的架构风格,主要用于解决印务客户端不同系统适配能力差、维护难的问题。政府部门计算机设计涉密安全问题,每次安装客户端过程繁琐,层层审批,而且针对不同的操作系统需要定制多种相对应的客户端,出现不同客户端表现不一致的问题就会成为不可挽回的重大问题。使用不同操作系统的客户端极易产生公文样式的展示效果差异,因此同意用户所见UI,是非常重要的环节。B/S架构就是解决这一问题的关键所在,并且这一架构技术目前成熟度非常高,例如html5几乎能够完全实现常见的视觉效果需求,项目中,我们还使用了大量的前端缓存技术与websocket技术,能够满足用户实时交互等需求。0客户端之下升级与维护都变得方便很多。这种风格中页面和逻辑处理存储在web服务器上,维护和软件升级只要更新服务端即可,即时生效,用户体验好,例如页面上需要优化,改一下javascript或css脚本就能立即产生效果。
经过我和团队的不懈努力,历史一年,项目终于于2020年12月顺利通过了验收,并得到了一致好评,运行至今,用户反馈良好。客户单位的集中印务业务水平大大提升。不过在实施过程中,也暴露了一些具体的问题,例如跨系统之间接口交互时,由于业务复杂,简单的队列机制无法满足繁忙场景如智能排产时,需要建立具有动态优先级调整机制的处理队列。还有项目架构设计过程中,我们忽略了对现代浏览器的严格限定,比较老旧的浏览器不支持比较新的前端技术。这些问题通过应急处理和协调,以及高层领导的推动,都得到了妥善的解决,没有影响到项目的总体进度。我们把这些经验与教训,总结到了工作总结里面,形成了组织过程资产,向其他技术人员分享,为今后系统架构设计提供帮助。相信通过不断持续学习改进,加强自己的系统分析与设计能力,努力工作提升工作水平,为社会和公司多贡献一点自己的价值。