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.在线学习课程平台系统分析设计流程图.pptx在线学习课程平台系统分析设计 流程图.pptx 10页内容提供方:教育教学资料分享 大小:94.56 KB 字数:约小于1千字 发布时间:2022-05-16发布于山东 浏览人气:906 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币 (10金币=人民币1元)https://max.book118.com/html/2022/0514/7005100033004122.shtm
2.在线学习系统由于信息工程技术的不断发展, 使得在线学习技术受到越来越多的关注和应用。在线学习是利用网络技术的设计,传输,选择,管理和使用来延伸日常学习,打破了时空的界限,在继承传统教育的基础上,充分发挥网络时代的学习观念。 本文采用结构化分析的方法,详细阐述了一个功能比较强大的在线学习系统的前后台开发、操作流程和涉及的https://blog.csdn.net/m0_52958155/article/details/138425106
3.物联网智慧教室系统架构流程图模板物联网智慧教室系统架构是一种基于物联网技术的智能化教学管理系统。该系统通过将教室内的各种设备与互联网连接,实现对教室内环境的智能监控和控制。例如,可以通过传感器实时监测教室内的温度、湿度、光照强度等环境参数,并根据预设的阈值自动调节空调、窗帘等设备的工作状态,以保持教室内舒适的环境。此外,还可以通过https://www.processon.com/view/639812e5f346fb465a858487
4.NTCE详细>> 日程安排 2024年中小学教师资格考试日期为:上半年笔试3月9日,面试5月11-12日;下… 详细>> 报名流程 登录。考生登录“中小学教师资格考试”(http://ntce.neea.edu.… 详细>> 考试服务 报名系统 成绩查询 合格证明查询 合格证明验证 教师资格认定https://ntce.neea.edu.cn/
5.在线教育管理系统腾讯云开发者社区是一种基于云计算技术的教育管理平台,旨在提供全面的在线教育解决方案。它通过集成各种功能模块和工具,帮助教育机构实现教学、学习、管理等方面的数字化转型。 在线教育管理系统的主要功能包括: 1. 教学https://cloud.tencent.com/developer/information/%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B2%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F
6.驻马店市专业技术人员在线学习平台获取专业技术人员继续教育电子证书指南(2020-09-18) 专业技术人员学时申报流程图 输入网址https://www.hnzjgl.gov.cn/,也可在百度等搜索引擎中搜索“河南省专业技术人员公共服务平台”进入平台首页 第一步登陆系统:已在该系统注册人员(未注册人员,请查看后面注册说明),以专业技术人员身份登陆进入“河南省专业技术人员http://zmdpx.jxjyedu.org.cn/2019/content.jsp?id=436&type=1&menu=1
7.广东省专业技术人员继续教育管理系统(新版)公需课/选修课/专业注:本年度公需课学习截止时间为2024年4月30日,过期将无法提供补修,请各位老师在规定时间内尽快完成学习。 联系人:陈老师 吴老师 电话:020-38802909、4009949699 、13928999953(微信同号) 附件: 1.专业技术人员继续教育申报流程图 广东人事人才培训网 2023年9月12日 广东省专业技术人员继续教育申报流程图 系统网址:http://www.gdrsrc.com/jxjy/wt/8053.html
8.优途UX教育怎么样?2023年课程介绍,深圳UX+UI设计培训机构我们课程结构的差异在于以用户体验、交互设计、UI界面设计为核心,深入讲解互联网大厂研发全流程,从用户体验设计、用户研究、场景分析、痛点分析、用户画像、数据分析、竞品分析、产品定位、业务流程图、产品信息架构、产品原型、DRD文档、UI规范、UI组件搭建、UI界面设计和开发对接、项目提案等多个真实项目环节进行教学,不https://www.yoojia.com/ask/17-11562387145828738598.html
9.在线教育系统学习路线模块的设计与实现论文在学习着选择课程,并且进行了学习路线类型的判断之后,学习者要按照预设的学习路线进行学习,为了简化串行学习路线和并行学习路线设计流程图。如串行学习所描述的那样,当学习着选择学习课程A 时,必须先学习课程B 和课程C。在学习课程B 和课程C 时需要经过和课程A 相同的判断过程。经过类型判断得到课程A 的前导课程数量https://www.unjs.com/lunwen/jiaoyu/20181031162259_1744560.html
10.成都市2024年度职称评审申报指南及常见问题解答申报人所在单位存在违规行为的,监管部门应责令限期整改;整改不力的,依法予以通报批评。 四川省职称评审信息系统申报流程图https://cdhrss.chengdu.gov.cn/cdrsj/c151954/2024-12/06/content_fdedbfd0c66846b485a65d4252e52380.shtml
11.中国教育在线“作为中国教育的联结者和赋能者,中国教育在线致力于成为推动中国教育前行的力量。多年来,中国教育在线专注教育领域,坚持满足各类教育需求,对接国内外2000余所高校、3000余所高中,覆盖全国30余个省市,发布各类权威的招考、就业、辅导等权威的教育信息,专注于为国内外http://eol.cn/