
day19 分布式事务
feng_fly_28
这个作者很懒,什么都没留下…
展开
-
20-自动添加选课开发-集成测试
定时任务,每一段时间调用一次,发布消息 查询到任务后,发送消息到队列 学习服务就收到了,因为监听添加选课的队列 rabbitTemplate.convertAndSend(ex,routingKey,xcTask);//发送消息到队列 监听添加选课的队列 取出消息内容,添加选课,添加成功之后,向mq发送完成添加选课的消息。订单服务就接受到完成选课的消息 订单服务就接受到完成选课的消息 测试 INSERT INTO `xc_task` ( `id`, `create_time`, `updat原创 2021-09-16 10:49:12 · 87 阅读 · 0 评论 -
20-自动添加选课开发-订单服务结束任务
4.2.1 需求分析 订单服务接收MQ完成选课的消息,将任务从当前任务表删除,将完成的任务添加到完成任务表。 4.2.2 Dao 1、删除xc_task 2、添加xc_task_his 定义过程略 4.2.3 Service 在TaskService中定义删除任务方法 //删除任务 @Transactional public void finishTask(String taskId){ Optional<XcTask> taskOptional = xcTaskRepository.find原创 2021-09-16 09:14:36 · 77 阅读 · 0 评论 -
19-自动添加选课开发-学习服务添加选课-测试
4.2 订单服务结束任务 删队列 启动学习服务和订单服务 打个断点原创 2021-09-15 17:38:35 · 69 阅读 · 0 评论 -
18-自动添加选课开发-学习服务添加选课-接收添加选课消息
4.1.5 接收添加选课消息 接收到添加选课的消息调用添加选课方法完成添加选课,并发送完成选课消息。 在com.xuecheng.learning.mq包下添加ChooseCourseTask类 @Component public class ChooseCourseTask { private static final Logger LOGGER = LoggerFactory.getLogger(ChooseCourseTask.class); @Autowired LearningService le原创 2021-09-15 17:10:23 · 103 阅读 · 0 评论 -
17-自动添加选课开发-学习服务添加选课
4 自动添加选课开发 4.1 学习服务添加选课 4.1.1需求分析 学习服务接收MQ发送添加选课消息,执行添加 选 课操作。 添加选课成功向学生选课表插入记录、向历史任务表插入记录、并向MQ发送“完成选课”消息。 4.1.2 RabbitMQ配置 学习服务监听MQ的添加选课队列,并且声明完成选课队列,配置代码同订单服务中RabbitMQ配置 4.1.3 Dao 学生选课Dao: public interface XcLearningCourseRepository extends JpaRepository原创 2021-09-15 17:01:26 · 136 阅读 · 0 评论 -
16-订单服务定时发送消息-乐观锁取任务
4.7 乐观锁取任务 考虑订单服务将来会集群部署,为了避免任务在1分钟内重复执行,这里使用乐观锁,实现思路如下: 每次取任务时判断当前版本及任务id是否匹配,如果匹配则执行任务,如果不匹配则取消执行。 如果当前版本和任务Id可以匹配到任务则更新当前版本加1. 1、在Dao中增加校验当前版本及任务id的匹配方法 public interface XcTaskRepository extends JpaRepository<XcTask, String> { //使用乐观锁方式校验任务id和版本原创 2021-09-15 16:49:12 · 4664 阅读 · 0 评论 -
15-订单服务定时发送消息-定时发送任务-测试
原创 2021-09-07 17:59:30 · 192 阅读 · 0 评论 -
14-订单服务定时发送消息-定时发送任务
4.5 定时发送任务 4.5.1 Dao 添加更新任务方法: //更新任务处理时间 @Modifying @Query("update XcTask t set t.updateTime = :updateTime where t.id = :id ") public int updateTaskTime(@Param(value = "id") String id,@Param(value = "updateTime")Date updateTime); 4.5.2 Service 添加发送消息方法:原创 2021-09-07 17:42:44 · 297 阅读 · 0 评论 -
13-订单服务定时发送消息-查询前N条任务-测试
原创 2021-09-07 15:16:10 · 92 阅读 · 0 评论 -
12-订单服务定时发送消息-查询前N条任务
4.2 RabbitMQ配置 向RabbitMQ声明两个队列:添加选课、完成选课,交换机使用路由模式,代码如下: @Configuration public class RabbitMQConfig { //添加选课任务交换机 public static final String EX_LEARNING_ADDCHOOSECOURSE = "ex_learning_addchoosecourse"; //添加选课消息队列 public static final String XC_LEARNING_ADD原创 2021-09-07 15:06:05 · 75 阅读 · 0 评论 -
11-订单服务定时发送消息-需求分析
4 订单服务定时发送消息 4.1 需求分析 定时任务发送消息流程如下: 1、每隔1分钟扫描一次任务表。 1、定时任务扫描task表,一次取出多个任务,取出超过1分钟未处理的任务 2、考虑订单服务可能集群部署,为避免重复发送任务使用乐观锁的方式每次从任务列表取出要处理的任务 3、任务发送完毕更新任务发送时间 关于任务表的添加: 正常的流程是订单支付成功向更新订单支付状态并向任务表写入“添加选课任务”。 目前订单支付功能没有开发,采用手动向任务表添加任务。 ...原创 2021-09-07 14:47:15 · 196 阅读 · 0 评论 -
10-Spring Task定时任务-并行任务
3.3 Spring Task并行任务 3.3.1 需求分析 在项目通常是需要多个不同的任务并行去执行。 本节实现Spring Task并行执行任务的方法。 3.3.2 配置异步任务 创建异步任务配置类,需要配置线程池实现多线程调度任务。 @Configuration @EnableScheduling public class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer { //线程池线程数量 private int c原创 2021-09-07 14:43:19 · 288 阅读 · 0 评论 -
09-Spring Task定时任务-cron表达式
3.2.2 cron表达式 cron表达式包括6部分: 秒(0~59) 分钟(0~59) 小时(0~23) 月中的天(1~31) 月(1~12) 周中的天 (填写MON,TUE,WED,THU,FRI,SAT,SUN,或数字1~7 1表示MON,依次类推) 特殊字符介绍: “/”字符表示指定数值的增量 “*”字符表示所有可能的值 “-”字符表示区间范围 “,” 字符表示列举 “?”字符仅被用于月中的天和周中的天两个子表达式,表示不指定值 例子: 0/3 * * * * * 每隔3秒执行 0 0/5 * *原创 2021-09-07 14:33:20 · 712 阅读 · 0 评论 -
08-Spring Task定时任务-串行任务
3 Spring Task定时任务 3.1需求分析 根据分布式事务的研究结果,订单服务需要定时扫描任务表向MQ发送任务。本节研究定时任务处理的方案,并实 现定时任务扫描任务表并向MQ发送消息。 实现定时任务的方案如下: 1、使用jdk的Timer和TimerTask实现 可以实现简单的间隔执行任务,无法实现按日历去调度执行任务。 2、使用Quartz实现 Quartz 是一个异步任务调度框架,功能丰富,可以实现按日历调度。 3、使用Spring Task实现 Spring 3.0后提供Spring Task原创 2021-09-07 11:49:25 · 343 阅读 · 0 评论 -
07-自动添加选课方案-解决方案分析
2.5.2 解决方案 本项目综合考虑选择基于消息的分布式事务解决方案,解决方案如下图: 1、支付成功后,订单服务向本地数据库更新订单状态并向消息表写入“添加选课消息”,通过本地数据库保证订单 状态和添加选课消息的事务。。 2、定时任务扫描消息表,取出“添加选课任务“并发向MQ。 3、学习服务接收到添加选课的消息,先查询本地数据库的历史消息表是否存在消息,存在则说明已经添加选课, 否则向本地数据库添加选课,并向历史消息表添加选课消息。这里选课表和历史消息表在同一个数据库,通过本地 事务保证。 4、学习服务接原创 2021-09-07 09:35:37 · 103 阅读 · 0 评论 -
06-自动添加选课方案-搭建订单工程
2.5 自动添加选课方案 2.5.1 搭建环境 根据自动选课需求,为了更好的分析解决方案,这里搭建订单工程及数据库。 2.5.2.1 创建订单工程 导入资料下的xc-service-manage-order工程。 2.5.2.2 创建订单数据库 1、创建订单数据库xc_order(MySQL) 导入xc_order.sql 1)xc_orders:订单主表 记录订单的主要信息 2)xc_orders_details:订单明细表 记录订单的明细信息 3)xc_orders_pay:订单支付表 记录订原创 2021-09-06 17:55:57 · 114 阅读 · 0 评论 -
05-分布式事务-解决方案
2.4 解决方案 2.4.1 两阶段提交协议(2PC) 为解决分布式系统的数据一致性问题出现了两阶段提交协议(2 Phase Commitment Protocol),两阶段提交由 协调者和参与者组成,共经过两个阶段和三个操作,部分关系数据库如Oracle、MySQL支持两阶段提交协议,本节 讲解关系数据库两阶段提交协议。 参考: 2PC:https://en.wikipedia.org/wiki/Two-phase_commit_protocol 2PC协议流程图: 1)第一阶段:准备阶段(prepar原创 2021-09-06 17:14:21 · 92 阅读 · 0 评论 -
04-分布式事务-CAP理论
2.3 CAP理论 如何进行分布式事务控制?CAP理论是分布式事务处理的理论基础,了解了CAP理论有助于我们研究分布式事务的 处理方案。 CAP理论是:分布式系统在设计时只能在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)中满足两种,无法兼顾三种。 通过下图理解CAP理论: 一致性(Consistency):服务A、B、C三个结点都存储了用户数据, 三个结点的数据需要保持同一时刻数据一致 性。 可用性(Availability):原创 2021-09-06 16:56:25 · 205 阅读 · 0 评论 -
03-分布式事务-分布式事务及相关概念
2.2 什么是分布式事务 1、什么是分布式系统? 部署在不同结点上的系统通过网络交互来完成协同工作的系统。 比如:充值加积分的业务,用户在充值系统向自己的账户充钱,在积分系统中自己积分相应的增加。充值系统和积 分系统是两个不同的系统,一次充值加积分的业务就需要这两个系统协同工作来完成。 2、什么是事务? 事务是指由一组操作组成的一个工作单元,这个工作单元具有原子性(atomicity)、一致性(consistency)、隔 离性(isolation)和持久性(durability)。 原子性:执行单元中的操原创 2021-09-06 15:47:18 · 95 阅读 · 0 评论 -
02-分布式事务-问题描述
2 分布式事务 2.1 问题描述 根据上边的自动选课的需求,分析如下: 用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。而学生选课信息在学 习中心数据库,由学习服务去维护学习中心数据库的信息。下图是系统结构图: 如何实现两个分布式服务(订单服务、学习服务)共同完成一件事即订单支付成功自动添加学生选课的需求,这里 的关键是如何保证两个分布式服务的事务的一致性。 尝试解决上边的需求,在订单服务中远程调用选课接口,伪代码如下: 订单支付结果通知方法{ 更新支付表中支付状态为“成原创 2021-09-06 15:37:03 · 72 阅读 · 0 评论 -
01-订单与选课需求分析
学成在线-第19天-讲义-分布式事务 1 订单与选课需求分析 1.1 订单支付流程 学成在线的课程分为免费和收费两种。对于收费课程,用户需提交订单并完成支付方可在线学习。 提交订单及支付流程如下: 1、用户提交订单需要先登录系统 2、提交订单,订单信息保存到订单数据库 3、订单支付,调用微信支付接口完成支付 4、完成支付,微信支付系统通知学成在线支付结果 5、学成在线接收到支付结果通知,更新支付结果 提交订单流程: 1、用户进入课程详情页面 2、点击“立即购买”,打开订单确认信息 3、点击“确认无误,提原创 2021-09-06 15:23:39 · 154 阅读 · 0 评论