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.在线教育系统业务,在线教育用户的需求是什么?线上学习的普遍需求在线教育系统业务,在线教育用户的需求是什么? 在线教育涉及的主要人群包括:学生、家长、老师、学校这四个方面,而各方的需求有相同的地方,那就是提高学生的学习成绩,但也有一些其他不同的需求。接下来我们就一起看看在线教育用户的需求。 一、老师、家长、学校、学生四方面对在线教育产品的要求https://blog.csdn.net/uudsjhd/article/details/136207445
2.在线数据分析平台腾讯云开发者社区当涉及抓取和分析在线视频平台数据时,Python爬虫是一个强大而有用的工具。下面我将为您提供一些步骤和代码示例,来帮助您进行这样的实战操作。 1.确定目标平台: 首先,您需要确定要抓取和分析数据的在线视频平台。常见的在线视频平台包括YouTube、B站、优酷https://cloud.tencent.cn/developer/information/%E5%9C%A8%E7%BA%BF%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B9%B3%E5%8F%B0
3.后疫情时代大学生在线教育需求变迁研究摘要:新冠肺炎疫情的爆發为在线教育产业的发展提供了良好的环境,一批在线教育企业在此背景下迎来了高速发展,但快速扩张的背后依然存在着一些问题。本文针对在线教育产业的“痛点”,通过对武汉市大学生进行问卷调查获取原始数据,基于马斯洛需求层次理论分析新冠疫情发生前后大学生对在线教育产品的需求变迁,并运用技术接受模型(https://www.fx361.com/page/2021/1203/9159388.shtml
4.8000字干货!在线启蒙教育的产品设计公式(附竞品分析模型工具)娱乐是一个兴奋性需求,作为互联网产品的深度习惯用户,如果能让孩子们一边学习一边娱乐,通过劳逸结合的形式帮助小朋友成长学习,这会非常棒。 4. 小结 从用户动机、痛点和需求分析不难发现,互联网的高速发展是催生在线英语启蒙教育的关键,其次 80、90 后这个核心用户群是互联网当下的主力军,他们消费力强,决策力果敢,https://www.uisdc.com/online-primer-design/
5.线上教室直播系统的数量与多样性分析农产品摘要:本文探讨了线上教室直播系统的数量和多样性。随着在线教育的兴起,线上直播教室系统日益普及,其数量和种类不断增多。这些系统提供了丰富的教学资源和工具,满足了不同学习者的需求。本文分析了线上直播系统的现状,探讨了其数量增长和多样性的原因,并展望了未来发展趋势。关键词:线上教室、直播系统、数量、多样性。http://sdhana.cn/post/12951.html
6.需求分析报告(通用12篇)本需求分析报告的目的是规范化本软件的编写,旨在于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,同时提出了本学校排课系统的软件开发过程,便于程序员与客户之间的交流、协作,并作为工作成果的原始依据,同时也表明了本软件的共性,以期能够获得更大范围的应用,同时它也是进行项目策划、概要设计和详细设https://www.ruiwen.com/word/xuqiufenxibaogao.html
7.系统架构师入门指南:从零开始学习系统架构设计系统架构师(System Architect)是指负责设计和构建软件系统架构的专业人士。他们的主要职责是规划和设计软件系统的整体架构,确保系统的可扩展性、可维护性、安全性以及与其他系统的集成能力。系统架构师在项目初期阶段就参与到需求分析、技术选型和架构设计中,从而为整个项目提供坚实的基础。 系统架构师的工作职责 系统架构https://www.imooc.com/article/361175
8.系统分析员职业信息库精通MS.NET技术体系、数据库技术和ORACLE、UML以及Rational Rose;掌握管理科学与系统工程基础知识;熟悉信息系统开发过程;理解信息系统开发标准;掌握需求分析、系统测试和系统维护基本技术;理解质量保证的手段;掌握计算机硬软件的基础知识;理解知识产权的基本知识;掌握组织与管理的基本知识。 https://www.eol.cn/html/sy/zhiye/c/19.shtml
9.教育大数据行业发展现状及前景战略规划建议报告第1章:教育大数据行业综述及数据来源说明 1.1 教育大数据行业界定 1.1.1 教育大数据的定义 1.1.2 教育大数据技术框架 1、技术采集 2、数据处理 3、数据分析 4、应用服务 1.1.3 教育大数据性质特征 1.1.4 教育大数据与传统教育数据的区别 1.1.5 教育大数据的分析体系搭建 https://maimai.cn/article/detail?fid=1846094883&efid=fVq5WNoRddfGQrd6lI_77A
10.优途UX教育怎么样?2023年课程介绍,深圳UX+UI设计培训机构iTarms企业信息化管理平台、吉林省公安部卡口管理系统、天地凤凰城智能安防系统、Suiyi移动应用网关、南方电网企业桌面管理系统、智慧云社区电商平台、智慧云社区物业管理系统、中矿集团坨矿管理平台、快橙网红大数据分析平台、IT服务器管理系统、K12教育后台管理系统、深港物联网物联定位系统。 https://www.yoojia.com/ask/17-11562387145828738598.html
11.在线教育服务行业发展预测分析.docx在线教育服务行业发展预测分析第1页在线教育服务行业发展预测分析 2一、引言 21.1背景介绍 21.2研究目的与意义 3二、在线教育服务行业现状 42.1市场规模与增长趋势 42.2主要企业及业务模式 62.3用户群体分析 72.4行业竞争格局 9三、技术进步对在线教育服务行业的驱动 103.1技术的创新与运用 103.2技术进步对教学模式的影响 https://www.renrendoc.com/paper/368770042.html
12.理论网(二)实现供需数字化精准匹配的可能性分析 数字化路径的引入不仅是一次供需精准匹配的创新尝试,更是一个可持续发展的系统工程。通过充分发挥大数据、人工智能和云计算等技术的作用,数字化路径将推动干部教育培训实现从传统向现代的转变。数字化路径将不断优化干部教育培训的各个环节,通过建立与干部学习需求实时对接的机制https://www.cntheory.com/zydxgjxzxybk/gbjyyj/zdwztj/202403/t20240328_63951.html
13.学生管理信息系统需求分析学生管理系统应该能够方便地进行家校沟通和家庭教育工作。系统应该提供互动平台,方便家长和教师之间的沟通和交流。系统还应该提供家庭教育资源,帮助家长更好地教育孩子,并能够记录和分析家庭教育的成效。 统一消息中心 综上所述,学生管理系统应该具备全面、准确、高效、方便的特点。只有通过对学生管理系统需求的全面了解和深https://www.yixinjie.com/lib/xuegong-41928.html
14.我国在线教育行业的需求及发展趋势分析.docx教育我国在线教育行业的需求及发展趋势分析.docx 18页内容提供方:黄橙文化 大小:1.1 MB 字数:约1.86万字 发布时间:2022-08-07发布于广东 浏览人气:66 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币 (10金币=人民币1元)我国在线教育行业的需求及发展趋势分析.docx 关闭预览 想预览更多内容https://max.book118.com/html/2022/0802/5010320313004314.shtm
15.教育4.0全球框架:未来学校教育与模式转变——世界经济论坛《未来伴随着第四次工业革命的到来,教育系统与全球经济社会的现实需求越发脱节,急需一个新的教育框架和模式,培养符合未来社会需求的人才。 在2020年1月世界经济论坛发布的《未来学校:为第四次工业革命定义新的教育模式》报告中,描述了教育4.0的全球框架、特征和方法,以案例方式展现了向教育4.0过渡的16所学校的教育模式。这http://www.1932jyzx.com/tashanzhishi/50.html