2.5.2 解决方案
本项目综合考虑选择基于消息的分布式事务解决方案,解决方案如下图:
1、支付成功后,订单服务向本地数据库更新订单状态并向消息表写入“添加选课消息”,通过本地数据库保证订单 状态和添加选课消息的事务。。
2、定时任务扫描消息表,取出“添加选课任务“并发向MQ。
3、学习服务接收到添加选课的消息,先查询本地数据库的历史消息表是否存在消息,存在则说明已经添加选课, 否则向本地数据库添加选课,并向历史消息表添加选课消息。这里选课表和历史消息表在同一个数据库,通过本地 事务保证。
4、学习服务接收到添加选课的消息,通过查询消息表判断如果已经添加选课也向MQ发送“完成添加选课任务的消 息”,否则则添加选课,完成后向MQ发送“完成添加选课任务的消息”,
5、订单服务接收到完成选课的消息后删除订单数据库中消息表的“添加选课消息”,为保证后期对账将消息表的消 息先添加到历史消息表再删除消息,表示此消息已经完成。
3 Spring Task定时任务 3.1需求分析
根据分布式事务的研究结果,订单服务需要定时扫描任务表向MQ发送任务。本节研究定时任务处理的方案,并实 现定时任务扫描任务表并向MQ发送消息。
实现定时任务的方案如下:
1、使用jdk的Timer和TimerTask实现
可以实现简单的间隔执行任务,无法实现按日历去调度执行任务。
2、使用Quartz实现 Quartz 是一个异步任务调度框架,功能丰富,可以实现按日历调度。
3、使用Spring Task实现 Spring 3.0后提供Spring Task实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支 持注解编程方式。
本项目使用Spring Task实现任务调度。
|
|