程序员的成长之路

互联网/程序员/技术/资料共享

关注

阅读本文大概需要 4 分钟。

来自:www.cnblogs.com/lizo/p/8035036.html

一、概述

随着时间和业务的发展,数据库中表的数据量会越来越大,相应地,数据操作,增删改查的开销也会越来越大。因此,把其中一些大表进行拆分到多个数据库中的多张表中。

另一方面,在分库分表以后还需要保证分库分表的和主库的事务一致性。这片文章介绍一下:https://zhuanlan.zhihu.com/p/25933039

本篇文章是基于非事务消息的异步确保的方式来完成分库分表中的事务问题。

二、需要解决问题

2.1 原有事务

由于分库分表之后,新表在另外一个数据库中,如何保证主库和分库的事务性是必须要解决的问题。

解决办法:通过在主库中创建一个流水表,把操作数据库的逻辑映射为一条流水记录。当整个大事务执行完毕后(流水被插入到流水表),然后通过其他方式来执行这段流水,保证最终一致性。

2.2 流水

所谓流水,可以理解为一条事务消息。

上面通过在数据库中创建一张流水表,使用一条流水记录代表一个业务处理逻辑,因此,一个流水一定是能最终正确执行的.因此,当把一段业务代码提取流水中必须要考虑到:

  • 流水延迟处理性。流水不是实时处理的,而是用过流水执行器来异步执行的。因此,如果在原有逻辑中,需要特别注意后续流程对该流水是不是有实时依赖性(例如后续业务逻辑中会使用流水结果来做一些计算等)。

  • 流水处理无序性。保证即使后生成的流水先执行,也不能出现问题。

  • 流水最终成功性。对每条插入的流水,该条流水一定要保证能执行成功

因此,提取流水的时候:

  • 流水处理越简单越好

  • 流失处理依赖越少越好

  • 提取的流水在该业务逻辑中无实时性依赖

2.3 流水处理器

流水处理器即要保证流水处理尽可能处理快,又能保证流水最终能执行成功。

设想一个场景:当出现某一条流水处理失败,如果流失执行器要等当前流水执行成功才继续往后执行,那么会影响后续流水的执行,更严重的是一直卡在当条记录,导致整个系统出现问题

因此,流水执行器中设置2个任务:

  • 第一个任务,流水处理任务,已最快的速度执行流水,如果流水处理失败了,也不影响后面流水处理

  • 第二个任务,流水校验任务,这个任务就是顺序检查流水记录,保证所有流水都执行成功,如果失败,进行重试,多次重试失败以后发出告警以让人工介入处理。

2.4 流水处理完成

因为流水表是放在原数据库中,而流水处理完成后是操作分库,如果分库操作完成去更新老表流水消息,那么又是夸库事务,如何保证流水状态的更新和分库也是在一个事务的?

解决办法是:在分库中创建一个流水表,当流失处理完成以后,不是去更新老表状态,而是插入分库流水表中、

这样做的好处:

  • 一般会对流水做唯一索引,那么如果流水重复多次执行的时候,插入分库流水表的时候肯定由于唯一索引检测不通过,整个事务就会回滚(当然也可以在处理流水事前应该再做一下幂等性判断)

  • 这样通过判断主库流水是否在分库中就能判断一条流水是否执行完毕

三、流水处理器基本框架

流水处理器其实不包含任何业务相关的处理逻辑,核心功能就是:

  • 通知业务接入方何时处理什么样的流水

  • 检验流水执行的成功

注:流水执行器并不知道该流水表示什么逻辑,具体需要业务系统去识别后去执行相对应业务逻辑。

3.1 流水执行任务

流水处理调度任务就是通过扫描待处理的流水,然后通知业务系统该执行哪一条流水。

示意图如下:

3.2 流水校验任务

流水校验任务就是要比较主库和分库中的流水记录,对执行未成功的流水通知业务系统进行重新处理,如果多次重试失败则发出告警。

流程示意图:

四、为什么不用事务消息

由于是既有项目进行改造(本人从事互联网金融,所以是绝对不容忍有任何消息丢失或者消息处理失败),不使用事务消息有1个原因

  • 需要额外引入消息队列,增加系统的复杂度,而且也需要额外的逻辑保证和消息队列通讯失败的时候处理

  • 其实1不算是主要原因,而是因为事务消息需要手动的commit和rollback(使用数据库不需要),那么问题来了,spring中事务是有传递性的,那我们事务消息何时提交又是个大问题,例如 A.a()本来就是一个事务, 但是另外一个事务B.b()中又调用了A.a() 那事务消息提交是放在A.a()还是B.b()中呢?

<END>

推荐阅读:

【52期】记一道简单的Java面试题,但答错率很高!

【51期】一道阿里面试题:说说你知道的关于BeanFactory和FactoryBean的区别

【50期】基础考察:ClassNotFoundException 和 NoClassDefFoundError 有什么区别

5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「2048」,即可免费获取!!

微信扫描二维码,关注我的公众号

朕已阅 

【53期】面试官:谈一下数据库分库分表之后,你是如何解决事务问题?相关推荐

  1. mysql分库分表面试_【53期】面试官:谈一下数据库分库分表之后,你是如何解决事务问题?...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.概述 ...

  2. 面试官三连问:分库分表了解吧?业界有哪些常用方案?可能存在什么问题?

    一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...

  3. 别再问什么是数据库分库分表了,看这里!

    编者语:为了避免被误解为:「手里有把锤子,看什么都是钉子!」,说明一下不是什么业务都适合分布式数据库,更不是用了分布式数据库性能就一定能得到扩展. 其次:本文为纯干货,建议先转发.收藏再观看. 分布式 ...

  4. 亿级流量网站架构核心技术之“数据库分库分表策略”

    本文节选自<亿级流量网站架构核心技术--跟开涛学搭建高可用高并发系统>一书 张开涛 著 电子工业出版社出版 小编会从留言中选择获赞最多的前五名用户免费送出此书哦!规则见文末. 数据库分库分 ...

  5. 一文搞懂MySQL数据库分库分表

    如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...

  6. 数据库分库分表,分片配置轻松入门!

    上次和大伙聊了 MyCat 的安装,今天来说一个新的话题,就是数据库的分片. 当我们把 MyCat + MySQL 的架构搭建完成之后,接下来面临的一个问题就是,数据库的分片规则:有那么多 MySQL ...

  7. 关系型数据库分库分表中间件之选型

    写在前面 本文主要介绍关系型数据库分库分表的中间件,主要包含中间件介绍.选项及其对比.虽然市面上很多分库分表中间件,但是大多数都是不友好或者社区活跃度不高的项目,当然还是有很多淘汰的中间件.目前,在实 ...

  8. 数据库分库分表中间件对比(很全)

    数据库(分库分表)中间件对比 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件( ...

  9. 数据库分库分表(sharding)系列

    数据库分库分表(sharding)系列 转载于:https://www.cnblogs.com/gotodsp/p/6517478.html

最新文章

  1. NVIDIA GPU上的直接线性求解器
  2. 在PHP中给表格加上css样式,表格CSS样式设置 给table表格设置CSS样式表
  3. 阿里云短信验证解决方案(java版)(redis存储)
  4. SharePoint 2010 BI(2):使用Visio“.NET研究” Service
  5. PS基础教程[3]如何去除照片上的水印
  6. 聊下 git 使用前的一些注意事项
  7. 手把手教你玩转ARP包(三)
  8. Golang高效实践之array、slice、map实践
  9. 公务员学python有什么用_关于大龄中年学python的几点想法
  10. XML中写注释的格式
  11. ENVI提取植被指数(NDVI)的两种方法
  12. 2018第九届蓝桥杯C++省赛B组题目汇总
  13. 如何区分两列中不同数据_快速找出Excel表格中两列数据不同内容的3种方法!
  14. Unity脚本设置Animator单个状态的speed
  15. Vue2.0 —— 运用算法实现 AST 抽象语法树
  16. spssχ2检验_实用医学统计:配对四格表资料的χ2检验之SPSS操作篇
  17. MOOC微信小程序开发从入门到实践~笔记
  18. 建设工程法规专科【4】
  19. SNN ANN 多模态融合 神经网络发展过程的两个分支
  20. VVIC接口,item_get - 根据ID取商品详情

热门文章

  1. android kotlin扩展添加域名
  2. Windows 11 版本介绍
  3. Python自动化测试学习3
  4. 自动化测试需要学习的知识
  5. arcgis制作格网图
  6. java jdk17 Tomcat
  7. feign源码解析 - 运行时
  8. 电脑双屏变单屏后,界面显示问题
  9. 【开源】STC单片机免冷启动自动下载器
  10. java什么时候定义方法,持续更新~