zoukankan      html  css  js  c++  java
  • 分布式事务-可靠消息最终一致性

    ---没有一种分布式事务解决方案能解决所有场景,也就是没有一个完美的分布式事务解决方案,或者说每个分布式事务解决方案都有各自的使用场景。

     更多分享请关注我的公众号

     、定义

    可靠消息最终一致性(异步确保型):顾名思义,也就是没有做到实时一致性,而是异步最终一致性。

            这里要注意,不是因为可靠消息最终一致性能做到分布式事务的功能,所以它就适合所有的场景,而是当业务适合用异步最终一致性,才用可靠消息最终一致性。

     、案例

            比如当用户下单后,给用户奖励,这个奖励的实时性用户不是很关心的,也就是延迟奖励影响不大,只要你最终保证能给用户奖励即可,这样的场景就适合用可靠消息最终一致性;但如果下单扣款场景,你的账户只够你下一个单,你先给用户下单成功,扣款延迟,那等你扣款还没成功,用户又下了几次单,判断账户的钱都还没扣都可以下单,那岂不是钱到时候扣款失败,却成功下了几次单。

            

     三、实现方式

    异步确保型通常是把消息发送到消息队列异步处理,其实这里主要是要保证消息队列的消息可靠性,当然每种消息队列有所不同,这里只以RabbitMQ为例。

    方式1:其实也可以还是用表来保证可靠性,而不用消息队列,最简单但不够友好的方式就是借用事务日志表,当消息的生产者处理完自己的业务后且把事务日志消息持久化到本地的数据库事务日志表中且状态为为消费,当消费者消费后,用一个定时任务去拉取消费者的消费业务状态来修改生产者那边的事务日志表状态,如果消费者业务未成功,则重新发送消息到队列给消费者消费。

    方式2:发送消息到消息队列需要保证消息的可靠性

    这里可以用持久化、发送确认、RabbitMQ的镜像模式

    ,而消息的消费需要做重试,既然有重试,就要保证消费的幂等性。这里其实就要在消息发送到队列的时候生成一个全局唯一值或者根据业务是否数据本身就有唯一值字段可以借用的。

     更多分享请关注我的公众号

  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/wangoublog/p/15392231.html
Copyright © 2011-2022 走看看