rabbitmq分布式事务海尚书

如何实现两个分布式服务(订单服务、学习服务)共同完成一件事即订单支付成功自动添加学生选课的需求,这里的关键是如何保证两个分布式服务的事务的一致性。尝试解决上边的需求,在订单服务中远程调用选课接口,伪代码如下:

5、分布式事务有哪些场景?

2.4.2事务补偿(TCC)TCC事务补偿是基于2PC实现的业务层事务控制方案,它是Try、Conrm和Cancel三个单词的首字母,含义如下:1、Try检查及预留业务资源完成提交事务前的检查,并预留好资源。2、Conrm确定执行业务操作对try阶段预留的资源正式执行。3、Cancel取消执行业务操作对try阶段预留的资源释放。

优点:最终保证数据的一致性,在业务层实现事务控制,灵活性好。缺点:开发成本高,每个事务操作每个参与者都需要实现try/conrm/cancel三个接口。

注意:TCC的try/conrm/cancel接口都要实现幂等性,在为在try、conrm、cancel失败后要不断重试。什么是幂等性?幂等性是指同一个操作无论请求多少次,其结果都相同。幂等操作实现方式有:1、操作之前在业务方法进行判断如果执行过了就不再执行。2、缓存所有请求和处理的结果,已经处理的请求则直接返回结果。3、在数据库表中加一个状态字段(未处理,已处理),数据操作时判断未处理时再处理。

优点:由MQ按异步的方式协调完成事务,性能较高。不用实现try/conrm/cancel接口,开发成本比TCC低。缺点:此方式基于关系数据库本地事务来实现,会出现频繁读写数据库记录,浪费数据库资源,另外对于高并发操作不是最佳方案。

在任务表中包括了交换机的名称、路由key等信息为了是将任务的处理做成一个通用的功能。考虑分布式系统并发读取任务处理任务的情况发生项目使用乐观锁的方式解决并发问题。

3SpringTask定时任务

3.1需求分析

根据分布式事务的研究结果,订单服务需要定时扫描任务表向MQ发送任务。本节研究定时任务处理的方案,并实现定时任务扫描任务表并向MQ发送消息。实现定时任务的方案如下:1、使用jdk的Timer和TimerTask实现可以实现简单的间隔执行任务,无法实现按日历去调度执行任务。2、使用Quartz实现Quartz是一个异步任务调度框架,功能丰富,可以实现按日历调度。3、使用SpringTask实现Spring3.0后提供SpringTask实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支持注解编程方式。

本项目使用SpringTask实现任务调度。

3.2SpringTask串行任务

3.2.1编写任务类在Springboot启动类上添加注解:@EnableScheduling新建任务测试类TestTask,编写测试方法如下:

例子:0/3*****每隔3秒执行00/5****每隔5分钟执行000***表示每天0点执行0012*WEN每周三12点执行01510*MON-FRI每月的周一到周五10点15分执行01510*MON,FRI每月的周一和周五10点15分执行

3.2.3串行任务测试参考task1方法的的定义方法,再定义task2方法,此时共用两个任务方法。

3.3.1需求分析在项目通常是需要多个不同的任务并行去执行。本节实现SpringTask并行执行任务的方法。3.3.2配置异步任务创建异步任务配置类,需要配置线程池实现多线程调度任务。

@Configuration@EnableSchedulingpublicclassAsyncTaskConfigimplementsSchedulingConfigurer,AsyncConfigurer{//线程池线程数量privateintcorePoolSize=5;@BeanpublicThreadPoolTaskSchedulertaskScheduler(){ThreadPoolTaskSchedulerscheduler=newThreadPoolTaskScheduler();scheduler.initialize();//初始化线程池scheduler.setPoolSize(corePoolSize);//线程池容量returnscheduler;}@OverridepublicExecutorgetAsyncExecutor(){Executorexecutor=taskScheduler();returnexecutor;}@OverridepublicAsyncUncaughtExceptionHandlergetAsyncUncaughtExceptionHandler(){returnnull;}@OverridepublicvoidconfigureTasks(ScheduledTaskRegistrarscheduledTaskRegistrar){scheduledTaskRegistrar.setTaskScheduler(taskScheduler());}}将@EnableScheduling添加到此配置类上,SpringBoot启动类上不用再添加@EnableScheduling3.3.3测试通过测试发现两个任务由不同的线程在并行执行,互不影响。

4.2RabbitMQ配置

4.5.1Dao添加更新任务方法:

publicinterfaceXcTaskRepositoryextendsJpaRepository{//使用乐观锁方式校验任务id和版本号是否匹配,匹配则版本号加1@Modifying@Query("updateXcTasktsett.version=:version+1wheret.id=:idandt.version=:version")publicintupdateTaskVersion(@Param(value="id")Stringid,@Param(value="version")intversion);...2、在service中增加方法,使用乐观锁方法校验任务

@TransactionalpublicintgetTask(StringtaskId,intversion){inti=xcTaskRepository.updateTaskVersion(taskId,version);returni;}3、执行任务类中修改

...//任务idStringtaskId=xcTask.getId();//版本号Integerversion=xcTask.getVersion();//调用乐观锁方法校验任务是否可以执行if(taskService.getTask(taskId,version)>0){//发送选课消息taskService.publish(xcTask,xcTask.getMqExchange(),xcTask.getMqRoutingkey());LOGGER.info("sendchoosecoursetaskid:{}",taskId);}...4自动添加选课开发4.1学习服务添加选课4.1.1需求分析学习服务接收MQ发送添加选课消息,执行添加选课操作。添加选课成功向学生选课表插入记录、向历史任务表插入记录、并向MQ发送“完成选课”消息。

4.1.3Dao学生选课Dao:

publicinterfaceXcLearningCourseRepositoryextendsJpaRepository{//根据用户和课程查询选课记录,用于判断是否添加选课XcLearningCoursefindXcLearningCourseByUserIdAndCourseId(StringuserId,StringcourseId);}历史任务Dao:

publicinterfaceXcTaskHisRepositoryextendsJpaRepository{}4.1.4Service1、添加选课方法向xc_learning_course添加记录,为保证不重复添加选课,先查询历史任务表,如果从历史任务表查询不到任务说明此任务还没有处理,此时则添加选课并添加历史任务。在学习服务中编码如下代码:

4.2.1需求分析订单服务接收MQ完成选课的消息,将任务从当前任务表删除,将完成的任务添加到完成任务表。4.2.2Dao1、删除xc_task2、添加xc_task_his定义过程略4.2.3Service在TaskService中定义删除任务方法

//删除任务@TransactionalpublicvoidfinishTask(StringtaskId){OptionaltaskOptional=xcTaskRepository.findById(taskId);if(taskOptional.isPresent()){XcTaskxcTask=taskOptional.get();xcTask.setDeleteTime(newDate());XcTaskHisxcTaskHis=newXcTaskHis();BeanUtils.copyProperties(xcTask,xcTaskHis);xcTaskHisRepository.save(xcTaskHis);xcTaskRepository.delete(xcTask);}}4.2.4接收完成选课消息在com.xuecheng.manage_order.mq包下ChooseCourseTask类中添加receiveChoosecourseTask,接收完成选课任务消息并进行处理。

/***接收选课响应结果*/@RabbitListener(queues={RabbitMQConfig.xc_learning_finishaddchoosecourse})publicvoidreceiveFinishChoosecourseTask(XcTasktask,Messagemessage,Channelchannel)throwsIOException{LOGGER.info("receiveChoosecourseTask...{}",task.getId());//接收到的消息idStringid=task.getId();//删除任务,添加历史任务taskService.finishTask(id);}4.3集成测试测试流程如下:1、手动向任务表添加一条任务。2、启动rabbitMQ.3、启动订单服务、选课服务。4、观察日志是否添加选课成功完成任务后将xc_task任务移动到xc_task_his表中完成任务后在选课表中多了一条学生选课记录

测试消息重复消费:1、手动向任务表添加一条任务。2、启动rabbitMQ.3、先启动订单表,等待消息队列是否积累了多个消息。4、再启动选课服务,观察是否重复添加选课

THE END
1.KnowledgeGraphStudio:让知识图谱构建更简单更智能查询性能较传统图数据库提升显著 灵活的扩展能力 模块化设计便于功能扩展 支持自定义索引和检索策略 可根据需求选择性启用功能组件 完整的生态支持 提供标准的 RESTful API 支持Python SDK 快速开发 配备直观的 Web 操作界面 这种架构设计不仅解决了传统知识图谱系统在处理非结构化数据时的局限性,还为构建智能化的知识应https://blog.csdn.net/Python_cocola/article/details/144434949
2.课程知识图谱与检索研究型数据集数据集介绍: 《课程知识图谱与检索研究型数据集》的数据分为两大类:知识图谱数据(简称图谱数据)和内容检索数据(简称检索数据)。图谱数据是提炼的课程知识点、知识点的描述和知识点间关系定义和描述的数据,存储在图数据库中。检索数据是对具体课程(国家公共慕课平台的课程)的内容标注信息和视频打点提及位置等数据,存储https://lib.cumt.edu.cn/sjk_content.jsp?urltype=news.NewsContentUrl&wbtreeid=1082&wbnewsid=3114
3.线上课程数据集数据集该数据集是941门在线课程的信息,信息内容含有课程ID、名称、类别、持续时间、注册、完成率、上线平台、价格和评价排名等属性。它提供了4个平台和各种课程类别的数据,可用于分析在线学习趋势、比较平台、可视化报告和构建预测模型。 数据列表 数据名称上传日期大小下载 https://tianchi.aliyun.com/dataset/186373/
4.云帆在线学习考试系统对国产化数据库的支持情况说明云帆学习考试系统是一款优秀的学习和考试系统! 一、全面适配国产数据库 -- 数据库表结构、查询语句整体优化、使之能最大程度兼容各种数据库,便于后续接入其他数据库; 图2-课程学习界面 图3-在线考试界面 八…https://m.sohu.com/a/833727483_121400378/
5.中国知网数据库中国引文库 学术图片 学术视频 音频 统计数据AI知数 法律法规 政府文件 科技报告 常用服务: 个人查重 智能写作 翻译助手 知网研学 华知大模型5.0从技术参数、推理性能到数据语料进行全面升级,服务专业领域,解决专业问题。[查看详情] 2024-10-15 AI Pat+专利检索分析系统全新上线 https://www.cnki.net/
6.Java实战之课程在线学习系统的实现java本文将采用SpringBoot+Spring+Mybatis+Thyeleaf实现一个课程在线学习系统,采用SpringBoot框架实现 前台模板用的thymeleaf数据库层采用mybatis框架注解模式,感兴趣的可以了解一下+ 目录 一、前言 项目介绍 采用SpringBoot+Spring+Mybatis+Thyeleaf实现的在线学习系统,一共2个身份。 管理员登录系统后可以管理所有用户信息,https://www.jb51.net/article/244287.htm
7.数字化学习资源及其应用专题培训数字化学习资源是指经过数字化处理,依据学习者特征进行编辑的,可以在多媒体计算机上或网络环境下运行的供学习者自主、合作学习的,且可以实现共享的多媒体材料。按其呈现方式不同,大致可以分为数字视频、数字音频、多媒体软件、CD-ROM、网站、电子邮件、在线学习管理系统、计算机模拟、在线讨论、数据文件、数据库等。 与http://www.zpxx.wj.czedu.cn/html/article731078.html
8.图灵课堂Java就业培训教程视频课程大纲《Java职业培训指南》视频课程大纲,图灵的Java在线就业课程主要面向在校大学生,没有就业机会转变。刚进入职场的技术小白,有基础想转行的IT在职人员学习,分阶段学习,保证学习效果从零基础直达就业。 Java就业培训教程主要介绍互联网公司的主流技术框架(例如Dubbo、Zookeeper、Lucene,Solr,ElasticSearch,MyCat,微信支付,Jenkinshttps://www.tulingxueyuan.cn/tlzx/tljc/796.html
9.LMS(学习管理系统)一探究竟全方位解说其意义与使用方法有关中国LMS(学习管理系统)的情况,请参阅“小知识④”。 ●LMS数据库可以收集与员工成长有关的各种数据 LMS数据库可以将参加各种培训的学员的学习履历存储起来。 例如,以e-Learning在线学习为例,学习的进度,测试中获得的分数,问卷中的回答内容,报告中的句子等。https://www.sh-lightworks.cn/column/7636
10.熬夜整理,大数据自学路线含网盘资源除此之外,还有一些更特制的系统/组件,比如Mahout是分布式机器学习库,Protobuf是数据交换的编码和库,ZooKeeper是高一致性的分布存取协同系统,等等。 (7)调度系统Yarn 有了这么多乱七八糟的工具,都在同一个集群上运转,大家需要互相尊重有序工作。所以另外一个重要组件是,调度系统。现在最流行的是Yarn。你可以把他看https://zhuanlan.zhihu.com/p/525534411
11.java免费开源在线教育系统在线java开发学习中心为用户提供在线学习服务,包括:我的课程、视频点播、视频直播、在线考试、在线答疑、学习统计等功能; 教学管理中心为教育机构或个人讲师提供教学管理功能,包括:课程管理、媒资管理、考试管理、问答管理等功能; 系统管理中心提供系统参数配置、CMS、数据字典、分类管理等功能。 https://blog.51cto.com/u_16099279/6735784
12.远程学习心得体会15篇(3)本系统数据库需求分析 本系统后台采用的是SQL Server 20xx 数据库,由于本系统面向的用户有三种类型:教师、学员和管理员,所以在数据库需求分析中就要重点考虑三方面的因素。 學员相关的信息包括: 在线学习;在线答疑;下载和上交作业;在线成绩浏览。对于管理员来说,他们登陆后的操作主要是:视频文件的`上传、修改和https://www.unjs.com/fanwenwang/xdth/20230427073609_6957321.html
13.框架人工智能数据库图片处理机器学习日志代码分析等C++ 资源大全中文版,标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等 - gaoqiangwu/awesome-cpp-cnhttps://github.com/gaoqiangwu/awesome-cpp-cn
14.长沙市就业与社保数据服务中心:长沙市“智慧人社”项目(一期)采购依托长沙市政务云和长沙城市超脑的支撑能力和相关标准,构建人社数据中台能力和建设人社数据资源库,完成省统一系统全量长沙业务数据回流及其他相应数据的采集、校验、转换和编目。提供数据资源管理和分析工具,支持多种数据源、采集方式的管理和监测,支持多种数据校验比对,提供分析数据差异的能力,通过内置或可配置的标准规则https://www.bidcenter.com.cn/newscontent-205864182-1.html
15.Java开发全栈知识体系架构学习(服务器微服务数据库思维导MyBatis可以根据不同的数据库厂商执行不同的语句,用于一个系统内多厂商数据源支持。 大部分场景下无需修改 9、mappers 配置引入映射器的方法。可以使用相对于类路径的资源引用、或完全限定资源定位符(包括file:///的URL),或类名和包名等等 10、cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关https://www.processon.com/view/60504b5ff346fb348a93b4fa
16.传统的关系型数据库和图数据库之间的区别,图数据库对于分析机器例如,谷歌的知识图谱项目使用了图数据库来存储和查询数百亿个实体和关系。 总之,可扩展的图数据库在分析、机器学习和人工智能等领域可以帮助研究人员和从业者更好地管理和分析复杂的关系数据,从中挖掘出有价值的信息和洞见。它们已经在各个领域有了广泛的应用,并且随着大数据时代的到来,将会有越来越多的应用场景涉及https://cloud.tencent.com/developer/article/2353592
17.放大招~尚学堂百套毕设项目视频教程发布(视频+源码+数据库),手5. mysql数据库基本使用 6. oracle数据库基本使用 7. SQL Server数据库基本使用 8. Tomcat服务器使用 第二阶段互联网和移动互联网项目 1. jsp网上招标系统 2. 城市公交查询系统 3. 动漫论坛的设计与实现 4. 个人博客系统的设计与实现 5. 网上拍卖系统_秒杀与竞价 https://www.bjsxt.com/news/10413.html