基于消息的分布式事务简单方案

原创 2016年05月30日 16:50:22

System-A为主系统



流程描述

1. system-A执行本地事务,

发送msg到redis,此时msg状态为unknown(这里全是unknown状态的msg,消息需要持久化,只有msg存在,即使system-b处理失败也可以有其他方式处理,一般是人工)

2.1本地事务提交

2.1.1 更改redis的msg状态为提交,从老的内存队列删除,并放入另一个内存队列(这里全是commit状态的msg)

2.1.2 monitorsystem负责把commit状态的msg发送到MQ,并把msg转移到commited的存储中

2.2.本地事务回滚

2.2.1删除redis中的msg

3.System-B执行事务

3.1从MQ接收msg,执行本地事务,需要有重试的机制和避免重复处理的能力。(当超过最大重试次数后还失败,则需要预警,人工参与处理。)

3.2处理成功后需通知system-a,system-a做相应处理,并删除redis中的msg

4.处理完通知

5.补偿通知

 

Monitorsystem的作用

1.      监控commit状态的msg 进行发送

2.      监控unknown状态的msg,根据具体逻辑去检查system-a,看看system-a的事务是否成功,来变更msg的状态。

3.      监控commited状态的msg,若过了一段时间还存在,则可能system-b通知失败,则monitor system去查system-b,然后进行补偿通知。

用来保证system-a成功的事务的消息可以发送,如果事务失败,则消息是unknown状态也不会被下游系统处理。

 

 

Messageresend system

基于某些情况,消息丢失,需要可以从system-a生成msg重新投递。

 

 

Precommit 阶段选择redis的理由

本来开始想用MQ来存储,由于这是消息的中转阶段,因为需要根据msgId对消息进行查询,然后还得更新已存在的消息的数据(状态值),然后查看了几个mq中间件,比较activemq,metaq,前者不支持查询消息,而对于更新消息状态则都不支持。所以mq无法支持这种消息中转存储。



参考:

http://blog.jobbole.com/89140/

分布式事务之最终一致的Mq实现

对分布式系统有过研究的读者,可能听说过“CAP定律”、“Base理论”等,非常巧的是,化学理论中ACID是酸、Base恰好是碱。这里我们不对这些概念做过多的解释,有兴趣的读者可以查看相关参考资料。这里...
  • myjcxd
  • myjcxd
  • 2016年11月01日 11:57
  • 6919

分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践

说到分布式事务,就会谈到那个经典的”账号转账”问题:2个账号,分布处于2个不同的DB,或者说2个不同的子系统里面,A要扣钱,B要加钱,如何保证原子性?一般的思路都是通过消息中间件来实现“最终一致性”:...
  • chunlongyu
  • chunlongyu
  • 2016年12月23日 22:08
  • 17411

用消息队列和消息应用状态表来消除分布式事务

由于数据量的巨大,大部分Web应用都需要部署很多个数据库实例。这样,有些用户操作就可能需要去修改多个数据库实例中的数据。传统的解决方法是使用分布式事务保证数据的全局一致性,经典的方法是使用两阶段提交协...
  • it_man
  • it_man
  • 2014年03月20日 09:02
  • 13603

分布式事务-可靠消息的服务的设计与实现(消息服务子系统)

  • 2016年10月28日 15:21
  • 1.49MB
  • 下载

MQ发送事务消息

MQ事务消息交互流程如下: 发送事务消息包含以下两个步骤: 发送半消息及执行本地事务 package com.alibaba.webx.TryHsf.app1;impor...
  • dancheren
  • dancheren
  • 2017年05月05日 17:27
  • 828

RabbitMQ之消息确认机制(事务+Confirm)

概述 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达bro...
  • u013256816
  • u013256816
  • 2017年02月17日 16:33
  • 16034

如何用消息系统避免分布式事务?

作者:伯乐在线-meituanalibaba 网址:http://blog.jobbole.com/89140/ 前阵子从支付宝转账1万块钱到余额宝,这是日常生活的一件普通小事,但作为互联网研...
  • he90227
  • he90227
  • 2016年10月24日 14:44
  • 1906

分布式事务"解决方案汇总 -- 2PC/TCC/事务消息/1PC

分布式事务"解决方案汇总 -- 2PC/TCC/事务消息/1PC 标签: 分布式事务2PC最终一致性TCC1PC 2017-05-10 13:56 975人阅读 评论(0) 收藏 举报 ...
  • linuxheik
  • linuxheik
  • 2017年09月06日 15:23
  • 227

(微服务)分布式事务-最大努力交付 && 消息最终一致性方案

小插曲 本话题已收入视频讲座《Spring Cloud分布式事务解决方案》大家不妨围观下。开源项目: CoolMQ,项目支持网站: http://rabbitmq.org.cn,最新文章或实现会更...
  • vvsuperman
  • vvsuperman
  • 2017年12月14日 16:39
  • 209

RocketMQ源码解析:事务消息

原文地址:RocketMQ源码解析:事务消息 RocketMQ 带注释地址 :YunaiV/incubator-rocketmq ��本系列每 1-2 周更新一篇,欢迎订阅、关注、收藏 G...
  • github_38592071
  • github_38592071
  • 2017年05月21日 17:06
  • 425
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于消息的分布式事务简单方案
举报原因:
原因补充:

(最多只允许输入30个字)