分布式事务 小结

分布式事务    如果系统规模较小,数据表都在一个数据库实例上,上述本地事务方式可以很好地运行,   但是如果系统规模较大,比如用户A账户表和用户B账户表显然不会在同一个数据库实例上,他们往往分布在不同的物理节点上,这时本地事务已经失去用武之地。

分布式事务解决方法    两阶段提交(多次节点间的通信,事务时间较长,锁定资源的时间较长,不适合高并发系统) 消息(最终一致性)   数据 在一段时间是不一致的,但是最终能够实现一致性,可以提高并发量,   比如,现在很多饭店都是小票排号,你点了什么菜,饭点的时候人很多,不能点了菜,马上就能上菜,但是你已经排上号了,最终都会给你上菜的.这就是最终的一致性. 很显然这样能够提高接待能力. 消息与业务耦合   Begin transaction   update A set amount=amount-10000 where userId=1;   insert into message(userId, amount,status) values(1, 10000, 1);//这里不直接发送消息 是因为如果消息发送了,但是B没有收到,这条链路就断了   End transaction   commit; 定时任务读取A消息表 发送消息   当上述事务提交成功后,我们通过实时消息服务将此消息通知用户B,用户B处理成功后发送回复成功消息,用户A收到回复后修改该条消息数据的状态。   用户A收到回复消息,,把消息从消息表中删除,并插入到消息备份表中,(可用于消息补偿) 防止消息的多次投递. 在B端做幂等控制, 在B端记录消息的消费情况    B端执行的情况的时候,都要先去查询一下这个消息是否存在,如果存在直接放弃.如果不存在就执行B的加钱操作,然后往消息表里面插入接收到的消息数据.这些操作在一个事务里面

定时任务去检索消息表,发送消息消费成功回调消息给A 消息与业务解耦  上述保存消息的方式使得消息数据和业务数据紧耦合在一起,从架构上看不够优雅,而且容易诱发其他问题。为了解耦,可以采用以下方式。

  1)用户A在扣款事务提交之前,向实时消息服务请求发送消息,实时消息服务只记录消息数据,而不真正发送,只有消息发送成功后才会提交事务;

  2)当用户A扣款事务被提交成功后,向实时消息服务确认发送。只有在得到确认发送指令后,实时消息服务才真正发送该消息;

  3)当用户A扣款事务提交失败回滚后,向实时消息服务取消发送。在得到取消发送指令后,该消息将不会被发送;

  4)对于那些未确认的消息或者取消的消息,需要有一个消息状态确认系统定时去用户A系统查询这个消息的状态并进行更新。为什么需要这一步骤, 举个例子:假设在第2步用户A扣款事务被成功提交后,系统挂了,此时消息状态并未被更新为“确认发送”,从而导致消息不能被发送。

优点:消息数据独立存储,降低业务系统与消息系统间的耦合;

缺点:一次消息发送需要两次请求;业务处理服务需要实现消息状态回查接口。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hrscy

记录网站诞生过程-使用hexo+github pages

此博客记录了搭建网站的详细过程,以及建站过程中遇到的一些坑。博客介绍了安装homebrew,nodejs,hexo,域名注册,github设置,DNS解析等过程...

1043
来自专栏Linux运维学习之路

day4、Linux基础题目

第一题 我想在/data/da 目录下面创建 一个 da.txt 文件  [root@ll ~]# cd /data/oldboyedu -bash: cd: ...

2498
来自专栏王小雷

解决The Network Adapter could not establish the connection

解决1 主机与虚拟机ping不通 解决2 状态: 失败 -测试失败: IO 错误: The Network Adapter could not establis...

3335
来自专栏about云

zookeeper原理

问题导读 1.zk service什么情况下不可用? 2.zk写数据,什么时候才算完成? 3.zk读数据可以在任意一台zk节点上,为什么? 4.zk znod...

3616
来自专栏前端知识分享

第106天:Ajax中同步请求和异步请求

用户填写所有信息后,提交给服务器,等待服务器的回应(检验数据),是一次性的。信息错误又要重新填写!

1342
来自专栏ASP.NET MVC5 后台权限管理系统

.Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决

说真心话,Eclipse跟我们.net的VS比起来就是屌丝比高富帅,一切都是那么的难用,速度慢得我无法忍受 于是想试试Google钦点的Android Stud...

1957
来自专栏ionic3+

【技巧】ionic多环境配置

这种方式稍显麻烦,也容易误操作,而比较优雅的方式是通过配置文件和命令行参数结合来实现。

1852
来自专栏Ryan Miao

redis学习之三配置文件redis.conf 的含义

摘自http://www.runoob.com/redis/redis-conf.html 安装redis之后的第一件事,我就开始配置密码,结果总是不生效,而我...

2715
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装Git

现代软件开发中不可或缺的工具是某种版本控制系统。版本控制系统允许您在源级别跟踪软件。您可以跟踪更改,还原到以前的阶段,然后分支以创建文件和目录的备用版本。

6377
来自专栏Linux运维学习之路

zabbix使用(自定义监控、自动报警)

自定义监控(制作模板) zabbix自带模板Template OS Linux (Template App Zabbix Agent)提供CPU、内存、磁盘、网...

5296

扫码关注云+社区

领取腾讯云代金券