美文网首页
RebbitMQ完成分布式事务

RebbitMQ完成分布式事务

作者: 任笙_8b8c | 来源:发表于2020-08-04 21:36 被阅读0次
    事务.png

    用户提交订单,积分添加使用分布式事务流程讲解:

    一.
    • 首先会在订单服务中会有一个add添加订单的方法,首先拿到登录人的名称,添加到order订单实体类中.
    • 调用service的添加方法,通过传递的登录人名称去调用查询存储在redis中的购物车信息方法返回一个map集合,拿到总金额,总数量,雪花算法生成的id,然后继续封装到一个Order实体类中,保存到订单表中.
    • 然后从map中遍历所有的订单信息,保存到订单项的表中,用过feign的远程调用,完成扣减库存并增加销量操作.
    • 封装一个Task实体 封装相应信息 任务表,往任务表中添加任务信息数据(Task实体).
    • 调用user服务,添加用户积分,传入金额和用户名
    • 删除封装到redis的订单信息
    二.
    • 添加一个定时任务,获取任务表中小于当前时间的任务信息,遍历查询到的集合,用rabbitTemplate.convertAndSend()方法往添加积分任务交换机对应的添加积分队列发送消息,将遍历的数据作为消息.每隔俩秒就调用一次.
    rabbitTemplate.convertAndSend(RabbitMQConfig.EX_BUYING_ADDPOINTUSER,RabbitMQConfig.CG_BUYING_ADDPOINT_KEY, JSON.toJSONString(task));
    @Scheduled(cron = "0/2 * * * * ?") //2秒调用一次
    
    三.
    • 在用户服务中去监听添加积分的队列,一旦有消息立马就能获取到对应的消息进行处理,这里我们需要对消息进行判断,如果消息为null,或者我们需要的信息为null时,直接return,
      如果redis中的任务是否存在,存在就return,因为此时已经有消息在处理了,
    • 如果不存在的话, 更新用户积分 将任务添加到redis中,通过订单id去查询,判断是否已经操作过了消息
    • 将任务加入redis中 设置过期时间30秒 以防事务回滚redis数据一直在
    • 修改任务积分(一块钱一分)
    • 记录积分日志的信息(日志表)
    • 删除redis中的信息
    • 操作完成调用发送消息,将拿到的消息转为json,发送到完成添加积分任务队列中.
    将任务加入redis中  设置过期时间30秒 以防事务回滚redis数据一直在
    redisTemplate.boundValueOps(task.getId()).set("exist",30, TimeUnit.SECONDS);
    
    删除redis中的信息
    redisTemplate.delete(task.getId());
    
    四.

    监听添加积分完成的消息队列,获取消息数据,转换为对应的实体,直接删除任务表中的数据.

    上述流程是订单提交后给用户完成积分的添加,保证在分布式下,使用rebbitmq完成分布式事务,保证消息一致性.

    相关文章

      网友评论

          本文标题:RebbitMQ完成分布式事务

          本文链接:https://www.haomeiwen.com/subject/yolprktx.html