系统架构设计师论文分享-论架构风格的应用

我的软考历程

摘要

2023年12月,我所在的公司通过了研发纱线MES系统的立项,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为技术Leader,全面负责纱线MES系统的架构设计和技术决策工作。本文结合我在该项目中的实践,详细介绍了架构风格在纱线MES系统中的应用,架构风格是系统组织中的一种惯用模式,是一个词汇表和一组约束。在该项目中,我们使用了微服务架构风格、事件驱动架构风格和虚拟机构架风格,这些架构风格有效地满足了我们对项目的质量和功能属性的要求。最终在2024年10月,该项目正式上线并对外提供服务,系统运行稳定,表现优异,目前已经有873家工厂接入了我们的系统,提高了生产效率,降低了运营成本,受到了工厂老板的一致赞扬。

项目背景

随着我国由制造业大国转向制造业强国以及国内工厂的智能化和数字化的转型持续推进,我所在某地某纺织科技公司基于自研的物联网平台相继开发了纺织和染整一体化系统,这些系统上线后,受到了工厂的追捧,也为公司带来了丰厚经济效益。基于此,我司决定在2023年12月研发纱线MES系统,该系统预计投资732万,计划十个月后上线,我被任命为技术Leader,全面负责纱线MES系统的构架设计和技术决策工作,该系统上线后将涵盖纱线工厂从清棉、梳棉、并条、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案以及基于数据的决策分析能力。该系统采用物联网层级架构,分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,本次重点开发内容为感知层和应用层,其中感知层采用Golang语言开发,作为联网网关部署在工厂侧,负责接受工厂各种感知设备的数据以及应用层的指令下发。应用层为本次开发重点,也是纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,前端使用UniApp做不同终端的页面,缓存使用Redis,消息队列使用RocketMq,日志、链路追踪和监控使用ELK、SkyWalking、grafana和prometheus,时序数据库采用OpenTsDB,最终通过devops的方式部署在K8s集群中。系统上线后,将提供如下功能:基础管理、权限系统、数据接入、订单排查、数字孪生、生产报表,工资计算、大屏展示等功能。该系统上线后,纱线工厂的生产效率提升了65.4%,运营成本降低了21.9%,效果非常显著。

论述内容

纱线MES系统涉及工厂众多,数据接入链路长,流程复杂,为了满足系统的质量属性和迭代速度,我们召开了多次会议进行讨论,最终我们决定采用多种架构风格来保障系统的开发。1、微服务架构风格。微服务架构风格把整个纱线MES系统按照DDD领域驱动设计的方式分成了多个微服务包括:生产排产微服务、工资微服务、细纱微服务、粗纱微服务、前纺微服务、报表微服务、数字孪生微服务等等。这些微服务独立部署、管理、开发、运行、有效地降低了复杂业务,提高了容错性和可扩展性。2、事件驱动架构风格。事件驱动架构风格通过使用分布式消息中间件,把不同微服务的交互方式变成异步的事件方式,这可以有效降低服务之间的强数据交互模型,变成解耦的松散交互方式。3、虚拟机架构风格。虚拟机架构风格,在应用方和底层之间提供了一层虚拟机,通过它可以解耦应用方与底层的耦合,虚拟机可以运行在不同的底层之上,而应用方只需要与虚拟机交互即可,极大简化了开发,增加了系统的灵活性。下面是各个架构风格的具体应用:

一、微服务架构风格

纱线业务复杂,如果采用单体架构,会遇到如下问题:1、开发慢,增加人手也无法加快速度;2、对系统进行改动非常复杂,改动一点内容就需要整体重新打包部署,效率低下;3、缺少自动化能力,人工管理会导致许多bug产生;4、使用新技术难度大,需要整体替换,增加风险。基于以上问题,我们决定采用微服务架构,具体过程如下:1、采用DDD领域驱动设计把纱线MES系统进行拆分,拆分之后的服务独立开发、测试、部署和管理,做到复杂应用解耦。2、通过引入Nacos来做服务的统一注册、发现和管理,比如工资微服务需要使用使用细纱微服务的数据,此时细纱微服务就需要把接口暴露给Nacos,然后工资微服务通过nacos获取工资微服务的接口,然后调用工资微服务的接口。同时,Nacos还充当分布式配置中心,所有的微服务都把配置放在Nacos中管理,这样就避免配置的不一致以及配置出现错误,同时Nacos支持版本管理、灰度发布、环境隔离等高级功能,极大地简化了配置复杂度。3、纱线微服务众多,每个微服务又提供了大量接口,为了简化外部调用纱线众多微服务接口的难度,我们引入了Spring Cloud Gateway(API网关),通过它,可以做到封装系统架构、认证和鉴权、负载均衡、缓存、统一流量入口、日志和审计、限流、降级、熔断等等功能,把一些通用的底层抽离了出来,让业务微服务更加专注业务开发,提高了开发速度。

二、事件驱动架构风格

在纱线业务中,事件驱动架构十分重要,通过事件驱动架构,可以做到异步、削峰、解耦。首先,感知层通过Mqtt协议与物联网平台(网络层)进行数据交互,而物联网平台与应用层的交互是通过Kafka进行的。我们在纱线MES系统中有一个专门的消费微服务负责消费来自物联网平台的数据,同时解析消息,根据不同的业务进行拆分,然后应用层内部通过RocketMQ的方式进行分发,其他微服务(比如细纱、粗纱、工资)分别订阅自己需要的消息进行消费然后构建自己的业务模型。我们纱线系统一共使用了三种不同的消息队列,之所以这么做,是因为不同的消息队列有着不同的使用场景,Mqtt协议是一种轻量级的物联网协议,为低带宽、不稳定的网络环境提供了可靠的网络通信。Kafka消息队列的特点是吞吐量大,性能高、适合大数据和日志记录等场景,而物联网平台就对应着大数量场景。RocketMQ比Kafka性能低一些,但是具有很多高级特性比如:顺序消息、事务消息、延时消息,这些高级特性可以满足很多特殊的应用场景,比如事务消息可以满足消息消费的数据一致性,而延时消息也有应用场景,在我们系统中,工单排产15分钟必须确认,如果没确认就需要发通知给用户,此时就可以用延时队列,再排产时发一个15分钟的延时消息,当15分钟后触发消费时,去检查确认状态,如果没确认就通知用户。

三、虚拟机架构风格

虚拟机架构风格在底层与应用层之间提供了一个虚拟机层,该虚拟机可以部署在不同的底层,于是应用层就不需要适配不同的底层了。在我们纱线业务中,工资微服务主要负责工资的统计和计算,而工资计算非常复杂,它根据工厂、工种、排班、计时、计产、计台等维度的不同分别有不同的计算方式,如果采用代码计算,每次增加工厂、或者改动计算方式都需要重新编译部署,代价太大。为了提高可维护性,我们采用虚拟机风格种的解释器架构风格,通过构造一种工资计算语法,该语法可以灵活表示计算方式,然后通过解释器对语法进行解释,并执行计算逻辑。通过这种方式,我们改动计算方式只需要定义工资计算脚本,在运行时加载就可以生效,极大地提高了系统的可维护性和灵活性。

总结

通过采用多种架构风格,我们满足了系统的质量属性和迭代速度,最终在2024年10月,纱线MES系统正式上线并对外提供服务,系统运行稳定,表现优异,已经有873家纱线工厂接入了我们的系统,通过数据比对,生产效率提高了生产效率提升了65.4%,运营成本降低了21.9%,效果显著。虽然项目取得了成功,但是也遇到过一些问题,在项目初期,我司产品经理对纱线业务没有理解透彻,导致产品需求出现了偏差,这导致几次需求变更和返工,让开发人员士气低落,为了解决这个问题,我提出如下解决方案:一,让产品经理去纱线工厂参与纱线生成全过程,与工人交流,提高需求准确度;二,开发也要介入需求确认,与产品经理及时反馈问题,做到敏捷沟通;三,在做设计时,要采用灵活的设计模型或者基于配置的方式,为之后的需求变更留下空间。我通过以上方法最终解决了这个问题,确保了项目的按时上线。通过这个项目,我不仅学到了多种架构风格,并且锻炼了自己的架构设计能力,同时让我明白了只有通过不断的参与业务,才能提高自己的技术和分析能力,才能在未来的工作中游刃有余,继续为祖国的纱线业务做出自己的贡献。