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.课堂在线教育系统/在线学习系统/网上学习系统本毕业设计的内容是设计并且实现一个基于SSM框架的课堂在线教育系统。它是在Windows下,以MYSQL为数据库开发平台,Tomcat网络信息服务作为应用服务器。课堂在线教育系统的功能已基本实现,主要包括学生、教师、课程信息、课程视频、课程作业、作业提交、作业批改等管理功能。 https://blog.csdn.net/m0_73706453/article/details/140743055
2.在线教育平台系统有哪些?自移动互联网时代的到来,在线教育行业得到了高速发展,现在我们经常能看到各种各样的线上课程的广告,这些线上教育机构都做的风生水起。不少教育行业的朋友想转战在线教育,但是不知道如何起步,不知道怎么选择在线教育平台系统。那么今天小格子就给大家讲讲现在常见的在线教学平台系统有哪些,希望对各位有所帮助。 https://m.grazy.cn/article/10023.htm
3.网课系统在线教育平台app有哪些“猿辅导”在线教育旗下的核心产品提供小学、初中、高中全科在线互动式教学。这里有一线名师在线授课,并且班主任会提供1对1的同步答疑辅导,确保学生的学习问题得到及时解决。 “云朵课堂”是基于saas系统搭建的,教育培训机构只需要进行域名注册,根据自身的需求选择系统内的功能组合使用即可,从开始使用系统到后期的系统维护等https://www.yunduoketang.com/article/llw2497.html
4.在线教育平台【超时代云课堂:www.360yunketang.com】在线教育平台系统为教育机构解决网校搭建技术问题,专业指导、协助机构进行免费搭建网校,并提供在线教育平台技术搭建服务。http://www.360yunketang.com/onlieducation/
5.java免费开源在线教育系统在线java开发java 免费开源在线教育系统 在线java开发 前言: 学成在线项目是传智燕青老师研发的JavaEE分布式微服务架构项目,采用SpringCloud框架研发,课程共20天,应广大学员的建议现将整个项目的技术点以问题的形式进行总结,方便大家学习总结。 1 学成在线是个什么样的项目?https://blog.51cto.com/u_16099279/6735784
6.十大云课堂平台在线课堂网站有哪些2024年云课堂十大排行榜最新发布,十大云课堂排行榜前十名有中国大学MOOC、学堂在线、学银在线、智慧树网、智慧职教、网易云课堂、哔哩哔哩、华文慕课、优学院、国图公开课。云课堂10大排行榜由品牌研究部门收集整理大数据分析研究得出,帮助你了解在线学习平台有哪些。https://www.maigoo.com/maigoo/9354ykt_index.html
7.教育培训管理软件线上教育系统招生运营管理平台在线教育 教育机构的互联网经营解决方案,为您实现 多校区一体化经营管理。了解更多> 免费试用 观看视频 或致电 13840318098 一站式解决教育机构的经营难题 招生拓客 教务管理 学员管理 互动督学 微商城扩展包 多校区解决方案 丰富的营销工具,精细化线索管理 http://www.sichem.cn/show.php?id=119901
8.创客匠人创客匠人专注在线教育培训平台系统软件开发,为教育培训机构提供网上教育、在线学习一站式解决方案。在线培训支持在线教育app、小程序、网校等形式,打造属于自己的网络课堂、教育直播平台。https://www.ckjr001.com/news/25.html
9.四只在线教育龙头股名单(建议收藏)4月23日市场表现方面,在线教育概念股平均上涨0.35%,上涨的有59只,涨停的有同辉信息,下跌的有34只,其中跌停的有威创股份。南方财富网趋势选股系统为您整理在线教育龙头股的相关信息。 本文目录一览 一、在线教育龙头股一览 二、在线教育概念股有哪些上市公司 一、在线教育龙头股一览 1、科大讯飞:龙头股 2022年第三http://www.southmoney.com/gupiao/jyts/202404/50553228.html
10.在线教育学习系统在线教育系统直播教学在线教育系统 为机构提供更专业的在线教学解决方案 免费体验 更适合移动互联网的 在线教育 立即体验 6种直播教学场景 助力老师打造优质在线教育 多生态渠道链接 增强机构品牌传播,快速拓展流量 教学模式任意切换 PC网校、H5店铺,小程序、独立APP全面覆盖 https://m.duanshu.com/study
11.在线教育系统教学系统软件在线培训系统网校系统北京医考巴巴医学考试网,隶属于北京昭天下教育科技有限公司。主讲老师昭昭老师,北京某三甲医院外科医师。中国医学考试培训青年领军人物,被广大学员誉为:中国医学考试培训系统画图理解综合记忆法第一人、京城四大名师、医考之王等。目前经其培训并顺利拿到执业医师和助理医师证书的学员数以万计,其讲授的医师培训(国家执业及https://www.268xue.com/2016/case.html
12.中国教育在线“作为中国教育的联结者和赋能者,中国教育在线致力于成为推动中国教育前行的力量。多年来,中国教育在线专注教育领域,坚持满足各类教育需求,对接国内外2000余所高校、3000余所高中,覆盖全国30余个省市,发布各类权威的招考、就业、辅导等权威的教育信息,专注于为国内外https://www.eol.cn/
13.TTEDU教育网校系统TTEDU是一款在线教育平台系统,以学习资源为核心,采用开放平台模式,满足各种场景需求,快速搭建有效、开放的在线学习平台。没有技术团队也能拥有自己独立的网校平台,从服务器配置到网校部署,均由专门技术团队完成,快速实现在线教学和招生,满足教育机构所有的网上教学https://www.oeob.net/ttedu