我的软考历程
摘要
2023年2月,我所在的公司做了开发纱线MES系统的决定,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为系统架构设计师,全面掌管该项目的架构设计工作。该项目涉及参与者众多,逻辑复杂,需求变化快,要求具有高性能、高可用、高可靠性以及灵活发布等特点。基于此,我们采用云原生技术,把系统中的非功能性特性剥离出来,具体而言,我们用到了弹性、可观测性、微服务等特性,如此,开发人员就可以专注业务功能的开发,从繁重的底层搭建中解放出来。借助云原生技术的加持,最终在2023年10月,该系统正式上线并运行至今,目前已经有879家工厂接入了我们的系统,系统运行稳定,表现优异,得到了客户工厂和公司领导的一致赞扬。
项目背景
随着我国从制造业大国升级为制造业强国以及工厂数字化和智能化的持续推进,我所在的某地某科技公司基于自研的物联网平台相继开发了染整一体化和织布一体化等系统,这些系统上线后,得到了工厂的追捧,也为公司带来了丰厚的经济回报。基于此,我司于2023年2月开始研发纱线MES系统,该系统总投资730万,开发周期10个月,涵盖纱线工厂从清花、梳棉、并条、精梳、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案以及基于数据的智能决策分析能力。该项目采用物联网层次架构,整体分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,这次重点建设内容为感知层和应用层,感知层使用Golang语言开发,作为联网网关部署在工厂侧,负责工厂数据的采集和云端指令的下发。应用层为纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,数据库使用Mysql,缓存使用Redis,前端框架使用vue.js,日志、监控和链路追踪采用skywalking、prometheus、grafana和ELK,最终通过devops的方式部署在kubernetes集群中。系统上线后,将提供以下:基础管理、数据接入、工单排产、数字孪生、工资计算、智控中心和数据分析等等功能,通过以上功能,可以全面提升纱线工厂的数字化和智能化水平,使其运营水平和生产效率得到质的提升。
论述内容
由于该系统涉及参与者众多,功能复杂,需求变化快,接入工厂设备达到483万多台,这就要求该系统必须具备快速部署、迭代速度快、高可用、高并发、高可靠性、高性能、高伸缩性等特性,基于此,我们团队一致同意采用云原生技术。目前云原生有多种架构模式,比如微服务、无服务、mesh化架构、事件驱动等等架构模式,每一种架构模式都有自己的应用场景。像无服务架构模式,它就适合消息驱动的处理任务,像事件驱动架构模式,它适合需要解耦的系统,具有良好的扩展性和可维护性。在本项目中,我们采用了微服务架构模式,微服务架构模式把系统按照领域分为一个个具体的模块,每一个模块作为微服务可以单独部署、开发、运行在独立的进程中,它具有独立管理、独立部署、技术异构、高容错性、高可靠性等特点。所以,为了实现我们的项目目标,我们使用了云原生中的微服务架构,通过领域驱动,把系统分解成领域独立的多个微服务,并在微服务架构中采用了云原生的弹性、可观测性、自动化等原则,帮助纱线MES系统实现快速部署、高迭代速度以及满足高并发、高可用、高性能的非功能质量目标,保证了纱线MES系统按时上线。
一、弹性原则
我们采用了云原生中的微服务架构模式,其中就用到了云原生中的的一个很重要的特性:云原生的弹性原则。我们项目针对纱线工厂,而纱线工厂的生产具有很强的季节性,每年的10月到来年的2月是一个旺季,这时候,纱线MES系统就需要应对海量生产数据的上报,而到了纱线工厂的淡季,就不需要应对海量并发请求,也就不需要那么多服务器资源。基于此,采用了云原生技术架构之后,就可以利用kubernetes中的机制,通过对容器的资源占用率做阈值设置,当资源利用率很低时,达到了阈值下限,就可以关闭一些容器,释放掉一些服务器资源,让服务器资源得到充分的利用,避免资源的浪费,提高系统的效益。当到了旺季后,大量生产数据的上报就会占用服务器的资源,此时,服务器的资源利用率就会上升,当达到阈值上限时,kubernetes就会自动分配新资源,启动新的容器。来应用海量的请求。我们的系统就是借助了云原生的弹性原则,有效了提高了系统的效益,降低了系统资源的浪费,以最小的代价,保障了系统的运行。
二、可观测性原则
由于本项目业务复杂,涉及参与者众多,同时需求变化快,迭代速度也快。这就要求当系统出现问题,或者在出现问题之前,就需要能够快速发现并处理掉问题,此外,由于需求变化快的缘故,这就要求我们的系统必须具备良好的测试性。这些特点就决定了我们的系统要具备可观测性,能够实时看到系统的状态,对于具体请求而言,要能够观察到这个请求从进入到结束的全流程链路。基于此,我们就用到了云原生中的又一个特性:可观测性。为了实现可观测性,我们使用了Skywalking、grafana、elk以及prometheus。通过它们,我们系统可以做到,每一个请求都能够清晰地看到它的完整链路,同时这些信息可以在页面上通过图形化展示出来,同时,系统的各项系统参数,比如cpu利用率、内部使用率、磁盘io等等都能在页面上清楚地看到。不仅如此,我们还可以实现实现自定义的报警,在设置一些阈值后,当系统的参数达到阈值之后,就可以通过电话、短信、钉钉、微信等方式直接通知到相应关系人,做到问题的快速响应。可以看到,借助云原生的可观测性,有效地提高了我们系统的可用性和可靠性。
三、自动化原则
在以前,项目的测试和部署都是通过手动的方式或者是脚本的方式执行的,但是,在本项目中,系统被分为了很多微服务,每一个微服务又是集群运行的。如果采用手动或者是脚本的方式去部署和运行,这是难以想象也是难以实施的。而云原生中的自动化原则就可以帮助我们项目解决这个问题。在项目代码开发过程中,每一次开发人员的代码提交都会触发自动的代码编译和代码检查任务,当代码有问题时,就会提示相关开发人员去修改代码,之后,CI/CD会自动地运行单元测试,但出现失败后,也会生成报告提示相关开发人员。当都没有问题后,就可以对代码生成版本号,生成对应的项目镜像,然后一键发布到对应的环境之中。不仅如此,发布还支持蓝绿发布和灰度发布,这有效提升了系统地连续运行能力。也正是接住了云原生的自动化原则,我们实现了四天一迭代,两周一个大版本的开发速度,有效保证了项目的顺利上线。
总结
通过采用云原生架构技术,我们的项目进展顺利,最终在2023年12月,该项目正式投产并对外提供服务,至今稳定运行,各项功能和性能指标均远远超过了客户的预期,得到了客户工厂和公司领导的一致赞扬。虽然项目取得了成功,但是也遇到过一些问题,在项目初期,由于产品经理对纱线业务的不熟悉,导致很多功能的调整和返工,这打击了开发人员的士气,基于此,我提出两个解决方式:1、派产品进入工厂一线,与工人交流,熟悉操作流程,彻底摸清纱线业务,保证需求质量;2、开发人员也要学习纱线业务,遇到问题反馈给产品,同时在做设计时,采用灵活的设计模式,为需求的变动留下可操作的空间。我们通过这两个方法解决了这个问题,保证了项目的进展。通过这次实践,我不仅学习到了云原生的相关技术,也锻炼了自己的架构和管理能力,我意识到只有不断地学习和实践才能让知识融汇于自己的技术体系之中,才能在未来的工作中游刃有余、勇担大任,为祖国的信息化建设贡献自己的力量。