消息驱动模式解决分布式数据一致性问题

目录

1.微服务架构下的事务问题

 2.并发测试

3.消息驱动模式的使用场景:


1.微服务架构下的事务问题

  

    问题栗子:

   

解决问题的办法:

 1.减少服务间的调用

 2.消息驱动的方式把服务串起来

  

     这种消息驱动的方式没有办法实现强一致性,比如说这个票转移还在处理的时候,用户发一个请求去查看他的余额,这个时候他看到扣款成功了。但是票还没出来。只能等他处理完了才能看到一致的状态。

    考虑他的出错的情况,第一个出错的情况,创建订单的时候出错,那么这个事务就会回滚,监听读的消息也会被回滚。但是如果order服务使用的order数据库和消息队列的使用的MQ数据源,这两个不是在一个JTA的事务里面,就可能会出现order服务本地的数据库的写操作已经完成并且提交,但是写消息的这个事务没有提交,写消息失败了怎么办?如果这个消息被重新触发,那这个order的写操作已经完成了,这下重复处理订单的数据怎么办呢?这个时候就需要使用幂等性,全局性id的方式去避免重复处理数据。

   如果在user服务出错,如果是在读消息出错,那没什么问题,他会回滚,然后重新处理,但是如果在写消息的时候出错,和上面的一样,user服务本地的数据已经完成提交,这个时候需要考虑数据重复处理的问题。另外一个错误就是在user服务里面如果出现了无法恢复的错误,但是上一步的order服务里面已经完成了订单的创建这个时候怎么办?那么这个创建的订单将永远会停留在未完成的状态。那么这个时候如何处理数据的回滚,处理这种情况的方法有两种,第一种就是将这个还未处理的消息写到一个特定的队列里面,专门用于处理失败消息的队列,通过读这些消息判断去回滚哪些操作,第二种解决的办法是通过一个定时的任务去扫描长时间处于未完成的订单,根据订单的状态处理。比如失败,回滚扣费操作等等。

  

    

   

     

        异常流程:

     

   

   

    

     

    docker 安装activeMQ: https://www.cnblogs.com/liyiran/p/11523319.html

    通过消息驱动的方式,正常的购票流程已经完成了。

   

    

     如果在锁票阶段出了问题,什么时候会出现锁票失败?当两个人几乎看到票有剩余,然后几乎同时买这个票,前一个人先进来把票锁住了,后面一个人就没办法进行正常的支付流程了对不对?所以后面一个人的订单应该去将他置为失败。

    余额不够的失败处理,直接返回了,没法继续完成支付对不对?这个订单处于一个创建的状态,这个票也一直处于一个锁住的状态,用户当然可以重新支付,但是如果用户一直不重新去支付这个订单,那么这个订单岂不是要一直处于新建状态,永远得不到完成,这张票也将永远被锁住。这样肯定是不行的,所以这个时候需要用到第二种处理错误的方法,使用定时任务清理这个超时的订单,主要要做的就是先将这个被锁住的票解锁,然后将这个订单置为失败。  当然扣费失败也可以马上处理将票解锁订单置为失败。

   如果票都交了,在订单完的时候出错,这个时候处理失败的时候还要考虑回滚这个交票的操作

user-service服务扣费失败后需要发送有个ticket_error到ticket-service去将锁住的票解锁,解锁票并且写上失败的原因,然后继续发送一个订单失败的消息到

 2.并发测试

    https://blog.csdn.net/weixin_37650458/article/details/102988019#7.%E5%B9%B6%E5%8F%91%E7%9A%84%E6%A8%A1%E6%8B%9F%E5%B7%A5%E5%85%B7

 ab工具:

3.消息驱动模式的使用场景:

https://github.com/WangAlainDelon/buyticket.git

 

 

 

概要介绍:本门课程属于“Java分布式中间件大汇聚实战”系列课程,主要介绍了企业级项目中真实的应用场景的实现及主流的Java核心技术栈(Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)的实战等等。除此之外,还介绍了如何基于Redis设计并实战一款点赞系统(点赞、取消点赞、排行榜、用户中心、文章点赞用户列表…)可以说技术干货甚多,不仅可以巩固企业级应用系统的开发实战能力,相信在面试、跳槽涨薪方面也能带来相应的帮助!课程内容:传说中的金三银四、面试跳槽涨薪季已经来临,Debug特地为大家准备了一系列跟面试、跳槽、巩固核心技术栈相关的课程,本门课程属于第一季,其中的内容包括企业级项目中真实的应用场景实战、面试相关的技术点分享、主流的Java技术栈(Undertow、Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)实战等等。除此之外,我们还基于Redis设计并实战了一款点赞系统,可以说技术干货甚多。在课程的最后,Debug给大家整理了一份最新的面向BAT大厂招聘 ~ 2020年程序猿最新的Java面试题(附带目录和答案),希望对各位小伙伴的成长有所帮助!值得一提的是,本季课程实战的应用场景包括“日志记录”、“邮件发送”、“通告消息通知”、“短信验证码失效验证”、“会员到期自动提醒/到期前N天自动提醒”以及“点赞系统”的设计与实战,其大纲如下所示:其中,涉及到的技术栈包括Spring Boot2.0、Mybatis、Undertow、Redis、RabbitMQ、Redisson、Spring AOP、 Java8…下面罗列出本门课程重点介绍的价格应用案例以及业务场景的实现流程图!(1)基于Spring的消息驱动模型实现日志的异步记录:(2)基于消息中间件RabbitMQ的消息队列实现日志的异步记录:(3)基于缓存中间件Redis的订阅发布机制实现商户公告消息通知:(4)基于Redis的Key失效与定时任务实现实现短信验证码的过期失效验证:其他核心、典型的应用案例和业务场景的实战可以详细参考“课程目录”!除此之外,我们还基于缓存中间件Redis设计并实战实现了点赞系统中的点赞功能模块,下面罗列出其中涉及到的相关功能模块的实战流程图:其课程收益如下所示:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值