我的软考历程

摘要

2023年9月,我所在的公司通过了研发纱线MES系统的立项,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的数字化和智能化水平。我在该项目中担任系统架构设计师一职,负责该项目的架构设计工作。本文结合我在该项目中的实践,详细论述了分布式事务技术及其应用。在该项目中,我们采用了微服务架构,把系统根据领域分析划分成了一个个的微服务,每一个微服务都有自己独立的数据库,这样就不可避免会面临分布式事务的问题,为了解决该问题,我们采用了基于seata的2pc和tcc以及基于消息队列的和最终一致性的机制来保障分布式事务。最终在2024年7月,该项目正式上线并对外提供服务,目前已经有563家工厂接入了该系统,系统运行良好,得到了客户的一致赞扬。

项目背景

随着中国制造不断地产业升级以及工厂数字化和智能化的持续发展,我所在的某地纺织科技公司基于自研的物联网平台相继开发了染整一体化和织布一体化平台,这些平台上线后,得到了纱线工厂的追捧,也为公司带来了丰厚的经济回报。基于此,我司于2023年2月开始研发纱线MES系统,该系统预算730万,建设工期发10个月,该项目涵盖了纱线工厂从清花、梳棉、并条、精梳、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案。该项目采用物联网层次架构模型,整体分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,这次的重点建设内容为感知层和应用层,感知层使用Golang语言开发,作为联网网关部署在工厂侧,负责工厂数据的采集和云端指令的下发。应用层为纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,数据库使用Mysql,缓存使用Redis,前端框架使用vue.js,日志、监控和链路追踪采用skywalking、prometheus、grafana和ELK,最终通过devops的方式部署在kubernetes集群中。系统上线后,将提供以下:基础管理、数据接入、工单排产、数字孪生、工资计算、智控中心和数据分析等等功能,通过以下功能,可以全面提升纱线工厂的数字化和智能化水平,使其运营水平和生产效率得到质的飞跃。

论述内容

该系统涉及模块众多,每一个业务都比较独立,所以我们架构组讨论决定采用微服务架构模型,把独立的业务作为一个个独立的微服务单独开发、测试和部署。在此情况下,每一个微服务都采用了独立的数据库,就不可避免产生了分布式事务的问题。比如,排产配置功能,在设置排产时,会调用工资、络筒、细纱等微服务的接口,并对各自的数据库进行表的修改,这种情况下,如果出现某一个服务的修改失败,就产生了分布式数据的不一致。为了解决这个问题,就需要引入分布式事务解决方案。目前主流的分布式事务解决方案有以下四种:1、两阶段提交;2、TCC机制;3、基于消息队列的分布式事务;4、基于本地表的事务。

1、两阶段提交。

这是一种经典的分布式事务解决方案,两阶段包括表决和执行两个阶段,在表决阶段都通过后才会提交事务,只要有一个节点有问题就回滚事务,都不提交。该方式可以保障事务的可靠性,缺点是性能较差,事务协调者需要等待所有节点的反馈。针对两阶段提交的特点,我们在需要严格保证事务型的业务上使用,通常要容忍一定的性能损耗。在纱线MES系统中,班组设置非常重要,纱线MES中的络筒、粗纱、细纱的数据统计都跟班组设置有关,一旦班组设置出现数据不一致问题,将导致纱线MES系统中的多个业务模块的数据出现不一致,让后续产生的工资计算、统计报表、数字孪生、大屏等等出现数据问题,为了解决这个问题,我们采用了两阶段提交方式,并引入了阿里开源的seata框架,通过该框架,确保了数据的一致性,避免发生数据问题,有力提升了系统的准确度。

2、TCC机制。

这是一种常见的分布式事务解决方式,TCC分别为Try,Confirm、cancel,在执行一项任务时,每一个节点都要提供Try、Confirm和cancel方法,Try方法负责锁定该任务需要的资源,比如你要排产,在try阶段就要把排产的工单给提前锁定,避免后续执行出现问题。在Confirm阶段,各个节点就需要执行任务了,在该阶段要保障任务正常执行,同时要满足幂等性,避免多次执行出现问题。如果在Try阶段,发现资源不够,或者任务没法执行,就执行cancel方法,把锁定的资源等释放掉。TCC机制优点是灵活,缺点是对系统代码侵入比较多,需要编写的代码比较多,不太好控制。

3、基于消息队列的分布式事务。

消息队列在大型系统中应用广泛,它有着削峰、解耦、异步、性能好的优点,同时通过它还可以实现分布式事务。具体做法如下:首先,需要设置消息发送方的发送级别,需要多个消息节点收到消息才返回成功,只要成功就确定消息已经进入了消息队列中,这就保证了消息在发送方的事务型。在消息的消费侧,需要取消消费者的自动提交机制,采用手动提交机制,只有消息被正常执行才提交消息。如此就保证了消费者侧的事务型。目前基于消息队列的分布式事务在大型项目中非常流行。在纱线MES系统中,工厂会触发停机事件,该事件到了云端后,云端需要处理停机业务,该业务涉及到工资微服务、络筒和细纱以及粗纱微服务,在这个过程中,如果有某个微服务处理失败,就会造成停机业务出现不同步的现象,为了解决这个问题,我们采用了基于消息队列的分布式事务方式。具体操作流程如下:发起方发送一个半消息,该消息存储在消息队列中,但是并没有并消费者消息,当发起方处理完成后,确认了事务再通知消息队列,让消费者消费。通过这种方式,既保证了事务,又没有系统之间的耦合。

4、基于本地表的分布式事务。

该方法需要提供一个本地表,把执行失败的任务记录到本地表中去,然后通过定时任务去执行失败的任务,如果执行三次还失败就报警给相关责任人,让责任人接入处理。我们在项目开发过程中,对于一些对时间比较敏感的业务就可以采用这种方式。比如在边端上报粗纱线核心数据时,由于模型匹配问题导致粗纱核心数据处理失败,这种情况下如果采用TCC或者AT模式将会影响云端处理的速度,基于此,就可以采用本地表的方式,把核心过程数据记录在表中,后面通过定时任务进行触发重新执行,让核心处理过程再次执行一遍,如果还是不行,就生成报警信息,通过短信、电话、飞书等方式通知响应开发人员介入处理。这种方式既保证了业务处理的快速又保证了事务的最终一致性,在现在系统开发中应用十分广泛。
以上四种方式在微服务架构中得到了广泛的应用,借助分布式事务,微服务才能保证数据的可靠性,避免出现系统性故障。

总结

通过采用分布式事务,我们保障了数据的可靠性,保障了项目的性能、可用性、安全性、可修改性等质量指标,确保了项目的按时上线。最终在2023年12月,该项目正式上线并对外提供服务,目前已经有563家工厂接入了我们的系统,系统运行良好,表现优异,得到了客户工厂和公司领导的一致好评。项目虽然获得了成功,但是也遇到过一些问题,在项目初期,由于产品对纱线业务的不熟悉,导致了多次功能的调整和返工,这让开发人员产生了抵触情绪。为了解决这个问题,我提出两个解决方案:1、派产品去工厂一线,熟悉纱线工厂操作流程,与工人交流,掌握纱线业务的难点和痛点,保障需求质量。2、开发人员也要参与需求的整理过程,有问题反馈给产品,同时在做设计时,采用灵活的设计模式,为需求的变更留下可操作的空间。通过这两个方法,最终解决了这个问题。得益于本次项目的实践,我不仅学到了分布式事务相关的知识,也锻炼了自己的架构和管理能力,我意识到只有不断地学习和实践才能让知识融汇于自己的技术体系之中,才能在未来的工作中游刃有余、勇担大任,为祖国的信息化建设贡献自己的力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88256.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88256.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88256.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东土科技智能塔机系统亮相南京,助力智能建造高质量发展

近日,由南京市城乡建设委员会、江苏省土木建筑学会主办的“无人驾驶智能塔机观摩会”,在中建三局一公司南京扬子江智慧中心项目现场成功举办。作为全国首批智能建造试点城市,南京市已出台20余项支持政策,落地93个试点项目&#xf…

3D Surface Reconstruction with Enhanced High-Frequency Details

3D Surface Reconstruction with Enhanced High-Frequency Details核心问题:当前基于神经隐式表示(如 NeuS)的 3D 表面重建方法,通常采用随机采样策略。这种随机采样难以充分捕捉图像中的高频细节区域(如纹理、边缘、光…

Science Robotics 耶鲁大学开源视触觉新范式,看出机器人柔性手的力感知

摘要:在机器人视触觉传感领域,如何兼顾成本与性能始终是一大挑战。耶鲁大学在《Science Robotics》上发表最新研究,提出了一种“Forces for Free”(F3)新范式。该研究通过观测一个经过特殊优化的开源柔性手&#xff08…

关于java项目中maven的理解

我的理解:maven是java项目的依赖管理工具,通过pom.xml文件配置要下载的依赖,settings.xml配置maven下载的镜像没有就默认在maven中央仓库下载依赖,本地仓库是存储下载好的依赖ai:1. 功能定位局限Maven 不只是依赖管理工具&#xf…

缓存三大问题详解与工业级解决方案

文章目录缓存三大问题详解与工业级解决方案概念总览问题详解1. 缓存穿透 (Cache Penetration)问题描述典型场景危害2. 缓存击穿 (Cache Breakdown)问题描述典型场景危害3. 缓存雪崩 (Cache Avalanche)问题描述典型场景危害工业级解决方案缓存穿透解决方案方案1: 布隆过滤器方案…

FreeRTOS 中主函数 while 循环与任务创建的紧密联系

FreeRTOS 中主函数 while 循环与任务创建的紧密联系 在嵌入式开发领域,FreeRTOS 是一款被广泛应用的轻量级实时操作系统,为开发者提供了高效的多任务调度机制。对于初学者来说,理解主函数中的 while 循环与通过 xTaskCreate 创建的任务之间的…

Flutter基础(前端教程⑦-Http和卡片)

1. 假设后端返回的数据格式{"code": 200,"data": [{"name": "张三","age": 25,"email": "zhangsanexample.com","avatar": "https://picsum.photos/200/200?random1","statu…

pytorch chunk 切块

目录 chunk切块 chunk​​​​​​​切块 import torch# 创建一个形状为 [2, 3, 4] 的张量 x torch.arange(6).reshape(2, 3) print("原始张量形状:", x.shape) print("x:", x) # 输出: 原始张量形状: torch.Size([2, 3, 4])# 沿着最后一个维度分割成 2 …

PCIe基础知识之Linux内核中PCIe子系统的架构

5.1 先验知识 驱动模型:Linux建立了一个统一的设备模型,分别采用总线、设备、驱动三者进行抽象,其中设备和驱动均挂载在总线上面,当有新的设备注册或者新的驱动注册的时候,总线会进行匹配操作(match函数),…

2.2 TF-A在ARM生态系统中的角色

目录2.2.1 作为ARM安全架构的参考实现2.2.2 与ARM处理器内核的协同关系2.2.3 在启动链中的核心地位2.2.4 与上下游软件的关系与底层固件的协作与上层软件的接口2.2.5 在ARM生态系统中的标准化作用2.2.6 典型应用场景2.2.1 作为ARM安全架构的参考实现 TF-A(Trusted …

Chrome 开发者警告:`DELETE err_empty_response` 是什么?jQuery AJAX 如何应对?

在Web开发的世界里,我们时常会遇到各种各样的错误信息,它们像一个个谜语,等待我们去破解。今天我们要聊的这个错误——DELETE err_empty_response,尤其是在使用 jQuery 的 $.ajax 发送 DELETE 请求时遇到,确实让人头疼。它意味着浏览器尝试删除某个资源,却收到了一个空荡…

python作业 1

1.技术面试题 (1)TCP与UDP的区别是什么? 答: TCP建立通信前有三次握手,结束通信后有四次挥手,数据传输的可靠性高但效率较低;UDP不需要三次握手就可传输数据,数据传输完成后也不需要…

centos7 java多版本切换

文章目录前言一、卸载原来的jdk二、下载jdk三、解压jdk三、配置环境变量四、切换JAVA环境变量前言 本来是为了安装jenkins,安装了对应的java,node,maven,git等环境,然后运行jenkins时候下载插件总是报错,我下载的jenkins是 2.346.1 版本&…

用Python和OpenCV从零搭建一个完整的双目视觉系统(四)

本系列文章旨在系统性地阐述如何利用 Python 与 OpenCV 库,从零开始构建一个完整的双目立体视觉系统。 本项目github地址:https://github.com/present-cjn/stereo-vision-python.git 在上一篇文章中,我们完成了相机标定这一最关键的基础步骤…

STM32-中断

中断分为两路:12345用于产生中断;678产生事件外设为NVIC设计流程:使能外设中断设置中断优先级分组初始化结构体编写中断服务函数初始化结构体:typedef struct {uint8_t NVIC_IRQChannel; 指定要使能或禁用的中断通道例如: TIM3_I…

Shader面试题100道之(61-80)

Shader面试题(第61-80题) 以下是第61到第80道Shader相关的面试题及答案: 61. 什么是UV展开?它在Shader中有什么作用? UV展开是将3D模型表面映射到2D纹理空间的过程,用于定义纹理如何贴合模型。在Shader中&a…

C#基础:Winform桌面开发中窗体之间的数据传递

1.主窗体using System; using System.Windows.Forms;public partial class MainForm : Form {public MainForm(){InitializeComponent();}// 打开二级窗体private void btnOpenSecondaryForm_Click(object sender, EventArgs e){// 创建二级窗体并订阅事件SecondaryForm second…

工程改Mvvm

导入CommunityToolKit vs2017只能导入7 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input;namespace WpfApp1.vi…

【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 动态修改编译配置

目录 1 -> 通过hook以及插件上下文实现动态配置 2 -> 在hvigorfile.ts中通过overrides关键字导出动态配置 3 -> 通过hook以及插件上下文动态配置构建配置 3.1 -> 修改每个hvigorNode中的build-profile.json5 3.2 -> 修改module.json5中的配置信息 3.3 -&g…

Android View事件分发机制详解

Android 的 View 事件分发机制是处理用户触摸(Touch)事件的核心流程,它决定了触摸事件如何从系统传递到具体的 View 并被消费。理解这个机制对于处理复杂的触摸交互、解决滑动冲突至关重要。 核心思想:责任链模式 事件分发遵循一个…