摘要
2023年2月,我所在的公司做了开发纱线MES系统的决定,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为系统架构设计师,全面掌管该项目的架构设计工作。本文将结合我在该项目中的架构设计工作经验,详细介绍在纱线工厂这一个特定领域,软件产品开发需要采用特定的架构方法,遵循特定的问题域和解域,聘用在该领域经验丰富的专家、分析人员、设计人员、开发人员,识别该领域中的可重用元素。在该项目中,根据纱线工厂领域的诸多特点,我们实施了领域分析、领域设计、领域实现,最终保证了该项目的各项功能和质量指标的实现,在2023年12月正式对外提供服务,至今运行稳定,得到了客户工厂和公司领导的一致好评。
项目背景
随着我国从制造业大国升级为制造业强国以及工厂数字化和智能化的持续推进,我所在的某地某科技公司基于自研的物联网平台相继开发了染整一体化和织布一体化等系统,这些系统上线后,得到了工厂的追捧,也为公司带来了丰厚的经济回报。基于此,我司于2023年2月开始研发纱线MES系统,该系统总投资730万,开发周期10个月,涵盖纱线工厂从清花、梳棉、并条、精梳、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案以及基于数据的智能决策分析能力。该项目采用物联网层次架构,整体分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,这次重点建设内容为感知层和应用层,感知层使用Golang语言开发,作为联网网关部署在工厂侧,负责工厂数据的采集和云端指令的下发。应用层为纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,数据库使用Mysql,缓存使用Redis,前端框架使用vue.js,日志、监控和链路追踪采用skywalking、prometheus、grafana和ELK,最终通过devops的方式部署在kubernetes集群中。系统上线后,将提供以下:基础管理、数据接入、工单排产、数字孪生、工资计算、智控中心和数据分析等等功能,通过以上功能,可以全面提升纱线工厂的数字化和智能化水平,使其运营水平和生产效率得到质的提升。
论述内容
由于纱线工厂是一个很专业的领域,开发人员很难清楚了解纱线工厂内部的流程和专业术语,在系统开发之前,我们团队做了深入的分析,决定使用DSSA(特定领域软件架构)。DSSA包括以下三部分:
1、领域分析。
这个工作的参与人员是领域专家和领域分析人员,它们需要在这个阶段,全面描述领域跟系统之间共同的领域模型。领域分析人员需要建立领域模型,但特定领域中往往蕴含比较专业的特定知识,这就需要依赖领域专家进行解答和定义。
2、领域设计
这个工作的参与人员主要是领域设计人员,主要目标是为了获取到DSSA(特定领域架构)。在有了领域模型之后,领域设计人员需要根据领域模型设计出特定领域架构,该架构要满足该领域的的需求,同时要生成可重用基础设施的规约。设计方法可以是常规的架构设计方法,但需要对该领域有一定的适应性。
3、领域实现
这个工作的主要参与人员是领域实现人员,主要目标是根据领域模型和DSSA(特定领域架构)开发和组织可重用信息和软件可重用的实现。主要内容就是软件重用、再工程、程序设计等等,所以该阶段更多依赖有领域经验的代码开发人员。
以上三个工作是结合DSSA的设计过程来依次展开的,其工作过程是并发的递归的和反复进行的,因此应采用螺旋模型。每一个循环分别包括:定义领域范围、定义领域特定的元素、定义领域设计和需求约束、定义领域模型和架构、获取可重要的产品单元。
一、定义领域范围、定义领域特定的元素。
纱线工厂具备现代流水线工厂的特性,它有如下的过程:清花、梳棉、并条、粗纱、细纱、络筒等流程,所以,在纱线工厂内部,就需要针对以上过程进行领域建设。首先,清花、梳棉、并条是前置处理流程,每一个过程都比较简单,所以整体作为一个前置领域。粗纱、细纱、络筒每一个过程都很复杂,所以它们都是独立的领域。就以细纱为例,细纱的领域范围是从粗纱结束后到络筒过程开始前,它的输入是粗纱,输出是细纱,中间是细纱领域内的逻辑。在这个过程中,需要关注捻度、成纱率、细度、支数、细纱等参数,这些参数也是该领域特定的元素。以此类推,我们的领域专家和领域设计人员依次完成前置领域和粗纱、细纱、络筒领域的范围定义和元素的识别。并根据该阶段的成果,建立了领域字典,方便大家学习查询,并统一大家的理解和认识。
二、定义领域设计和实现需求约束。
本阶段主要要达成识别该项目中的约束,并记录约束对设计和实现造成的后果。约束是一种规约和约定,项目在实现时,要达成的一些要求,比如必须采用国产系统等等。在纱线MES系统中,工厂对于性能和安全有一定的要求,性能要快,数据从工厂到大屏展示出来不能超过2分钟,同时工厂的数据从传输的过程中不能被泄漏和篡改。为了满足这些约束,我们基本确定了以下原则:1、采用加密或专用网络;2、采用base原则。第二条主要是为了性能,如果要保持数据的强一致性,那就会对性能造成影响,在纱线工厂中,数据上报很快,同时也会重复上报,一次两次的数据丢失不用有影响,所有采用base是可行的。等这些原则确定后,就为后续的工作打下了基础。
三、定义领域模型和架构。
本阶段的目标是是确定架构模型,并说明该架构的语法和语义。在有了领域模型和领域设计约束后,我们团队决定采用面向对象的设计方法来设计我们的系统。我们通过类图去描述系统的逻辑,通过用例图描述系统的功能,通过状态图描述类中的复杂交互,最终通过4+1对架构进行描述。然后,我带着架构组的同事,对系统进行微服务化设计,根据领域模型,我们把我们的系统分为了若干个微服务,并定义了每个微服务要对外提供的接口以及微服务之间的管理和配合方式。为了降低复杂度,我们又对微服务做了分层设计,分为接口层、逻辑层、数据层,微服务再通过api网关对外提供服务,共同支撑起这个项目。同时为了性能和可扩展性,我们在系统中引入了消息队列和缓存组件,消息队列能提供解耦、削峰、异步的功能,而缓存能降低用户访问的延时,有效降低响应时间。
四、获取可重要的产品单元。
本阶段目标是为DSSA增加构件,通过构件去解决系统所面临的问题。比如,系统会有认证授权的功能,这个功能每个微服务都要用,但是不可能让每个微服务都写相同的代码。于是,我们是通过把认证授权独立起来,单独作为一个模块,然后其他微服务需要的情况下,就可以引入该模块实现认证授权的功能。再比如,我们需要对微服务进行横向的管理,对微服务进行注册和发现。这种功能如果是自己实现是非常麻烦和耗时的,经过讨论我们决定使用nacos,nacos是阿里开源的一个注册和配置中心。通过它,可以为微服务提供注册发现机制,降低管理微服务的成本。再比如,我们用实现异步的功能,这就需要通过消息队列。在对比了几种消息队列(kafka、rocketmq)后,我们决定使用rocketmq,rocketmq具有更强的功能,可以提供延时队列,事务消息、顺序消息等功能,可以有效满足我们系统的多种需求。
总结
通过采用DSSA(特定领域架构),我们的项目进展顺利,最终在2023年12月,该项目正式投产并对外提供服务,至今稳定运行,各项功能和性能指标均远远超过了客户的预期,得到了客户工厂和公司领导的一致赞扬。虽然项目取得了成功,但是也遇到过一些问题,在项目初期,由于产品经理对纱线业务的不熟悉,导致很多功能的调整和返工,这打击了开发人员的士气,基于此,我提出两个解决方式:1、派产品进入工厂一线,与工人交流,熟悉操作流程,彻底摸清纱线业务,保证需求质量;2、开发人员也要学习纱线业务,遇到问题反馈给产品,同时在做设计时,采用灵活的设计模式,为需求的变动留下可操作的空间。我们通过这两个方法解决了这个问题,保证了项目的进展。通过这次实践,我不仅学习到了DSSA的相关技术,也锻炼了自己的架构和管理能力,我意识到只有不断地学习和实践才能让知识融汇于自己的技术体系之中,才能在未来的工作中游刃有余、勇担大任,为祖国的信息化建设贡献自己的力量。