分布式全局ID与分布式事务
1. 概述
老话说的好:人不可貌相,海水不可斗量。以貌取人是非常不好的,我们要平等的对待每一个人。
言归正传,今天我们来聊一下分布式全局 ID 与分布式事务。
2. 分布式全局ID
2.1 分布式数据库引发的问题
在数据库中,每个表都有一个主键(ID),用于作为一条数据的唯一标识。
在单体数据库中,大多数时候,我们会采用主键自增的方式生成 ID。
但在分布式的数据库中,使用了分库分表后,数据会被分配到多个表中,这时再用主键自增的方式就不合适了,每张表的 ID 都是从 0 开始自增,多个表中会出现重复的 ID,从而引发业务问题。
2.2 分布式全局ID的常用策略
2.2.1 UUID
UUID 我们再熟悉不过了,即使是单体数据库,我们也常常会使用 UUID 作为 ID 的值。
UUID的好处是使用简单,一句Java代码就能简单的生成,而且保证绝对全局唯一。
UUID也有不好的地方,一个是长度较长,至少需要32位,而且只是单纯的ID,没有实际意义,也不能作为排序的依据。
之前介绍过的 MyCat 和 ShardingJDBC 都有自动生成ID的机制,但 MyCat 不支持 UUID。
我们也可以使用工具类帮我们生成UUID,或者使用框架生成,例如:JPA。
2.2.2 雪花算法
雪花算法生成的ID,是一个 64bit 的 Long 型数字,是一个递增的数字,可用于排序。
雪花算法基本可以保持全局唯一,毫秒内可并发4096个数字。
但时间的回调可能会引起 ID 的重复。
3. 分布式事务
3.1 分布式数据库导致的事务问题
事务这个词,我们并不陌生,在单体数据库中,所有的业务表都在一个数据库中,在 SpringBoot 中我们常常会使用 @Transactional 注解去保证事务。
但到了分布式数据库,常常会根据业务对数据库进行 垂直切分 和 水平切分,一个业务方法常常会操作两个或多个数据源,此时 @Transactional 注解 就无法保证事务了。
3.2 分布式事务的常用策略
3.2.1 基于XA协议的两阶段提交
两阶段提交,分为两个阶段,准备阶段 和 提交阶段。
简单理解就是 所有的事务先准备成功后,然后一起提交,如果有一个事务准备失败,所有事务都会回滚。
如果在提交阶段出现了问题,则会造成事务的不一致,需要人工介入。
在两阶段提交过程中,在所有事务没有完全提交完成前,数据是锁死状态,其他线程访问会被阻塞。
由于两阶段提交需要等待所有的事务提交完成,因此效率低下,性能与本地事务相差10倍,用户体验不是很好。
在生产环境不建议使用。
3.2.2 事务补偿机制(TCC)
TTC就是 try、confirm、cancel,简单说就是每个操作都有一个对应的取消(cancel)方法,如果执行失败,则调用取消(cancel)方法撤销之前的操作。
如果取消(cancel)方法执行时发生了错误,则需要定时任务去轮询补偿,或者人工介入。
事务补偿机制的好处是逻辑比较简单,先执行 A 事务,再执行 B 事务,B 事务执行失败了,则调用 A 事务的取消(cancel)方法撤销 A事务 之前的操作。
但需要程序员自己编写的代码较多,无形中增加了很多工作量,且容易出错。
3.2.3 使用消息队列(MQ)实现最终一致性
利用消息队列的机制,异步的去执行每一个事务,达到最终一致。
通常的做法是 在本地维护一个消息表,或者给业务数据增加一个消息状态字段。
将后续的操作以消息的形式发送到消息队列,消息队列收到消息后给予Ack回执,收到回执后修改消息的状态。
消费者从消息队列订阅消息,执行接下来的逻辑,要注意消费方法的幂等性。
当然还需要有一个定时程序,轮询消息表,发现有问题的消息,执行重发或修改状态人工介入。
推荐以这种方式实现分布式事务。
4. 综述
今天聊了一下 分布式全局ID与分布式事务,希望可以对大家的工作有所帮助。
欢迎帮忙点赞、评论、转发、加关注 :)
关注追风人聊Java,每天更新Java干货。
5. 个人公众号
追风人聊Java,欢迎大家关注

分布式全局ID与分布式事务的更多相关文章
- 分布式全局ID生成器设计
项目是分布式的架构,需要设计一款分布式全局ID,参照了多种方案,博主最后基于snowflake的算法设计了一款自用ID生成器.具有以下优势: 保证分布式场景下生成的ID是全局唯一的 生成的全局ID整体 ...
- 高并发情况下分布式全局ID
1.高并发情况下,生成分布式全局id策略2.利用全球唯一UUID生成订单号优缺点3.基于数据库自增或者序列生成订单号4.数据库集群如何考虑数据库自增唯一性5.基于Redis生成生成全局id策略6.Tw ...
- 分布式全局ID生成器原理剖析及非常齐全开源方案应用示例
为何需要分布式ID生成器 **本人博客网站 **IT小神 www.itxiaoshen.com **拿我们系统常用Mysql数据库来说,在之前的单体架构基本是单库结构,每个业务表的ID一般从1增,通过 ...
- 分布式全局ID生成方案
传统的单体架构的时候,我们基本是单库然后业务单表的结构.每个业务表的ID一般我们都是从1增,通过AUTO_INCREMENT=1设置自增起始值,但是在分布式服务架构模式下分库分表的设计,使得多个库或多 ...
- 分布式全局ID的几种生成方案
前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等. 那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是 ...
- 高并发情况下,如何生成分布式全局id
1.使用UUID生成全局id,不占用宽带 2.基于数据库自增或者序列生成全局id,占用宽带,设置自增步长实现集群,但可扩展性差 3.基于redis生成全局id,占用宽度,设置自增步长实现集群,性能比数 ...
- 分布式全局唯一ID的实现
分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...
- 使用雪花算法为分布式下全局ID、订单号等简单解决方案考虑到时钟回拨
1.snowflake简介 互联网快速发展的今天,分布式应用系统已经见怪不怪,在分布式系统中,我们需要各种各样的ID,既然是ID那么必然是要保证全局唯一,除此之外,不同当业务还需要不同 ...
- 冰河开源了全网首个完全开源的分布式全局有序序列号(分布式ID)框架!!
写在前面 mykit-serial框架的设计参考了李艳鹏大佬开源的vesta框架,并彻底重构了vesta框架,借鉴了雪花算法(SnowFlake)的思想,并在此基础上进行了全面升级和优化.支持嵌入式( ...
随机推荐
- Redis cluster的部署
Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下 ...
- golang GC 垃圾回收机制
垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Golang中的垃圾回收主要应用三色标记法, ...
- RabbitMQ详解(一)——
RabbitMQ详解(一)-- https://www.cnblogs.com/liuwenwu9527/p/11989216.html https://www.cnblogs.com/ideal-2 ...
- 最详尽的 JS 原型与原型链终极详解(1)(2)(3)===转载
转载===方便以后复习 原文网址:https://www.jianshu.com/p/dee9f8b14771 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为 ...
- Python - 面向对象编程 - 小实战(2)
需求 小明和小美都爱跑步 小明体重 75 公斤 小美体重 45 公斤 每次跑步会减肥 0.5 公斤 每次吃东西体重增加 1 公斤 需求分析 小明.小美都是一个具体的对象,他们都是人,所以应该抽象成人类 ...
- 知乎大佬图文并茂的epoll讲解,看不懂的去砍他
select.poll.epoll的文章很多,自己也看过不少经典好文.不过第一次看到讲的如此通俗易懂.又图文并茂的.因此拿来分享下,供后续翻看学习. 原文链接:https://zhuanlan.zhi ...
- VUE006. 前端跨域代理服务器ProxyTable概述与配置
概述 使用 vue-cli 工具生成一个 vue 项目: vue init webpack my-project-vue 在生成的项目结构里,会有一个 index.js 文件.在这个文件里 ...
- 地址栏url中去掉所有参数
1.地址栏url中去掉所有参数,这个是纯前端解决,很多时候页面跳转时候会选择在url后面带参数过去,(使用?&),方便传也方便取,但是我们要做的是不要让页面的一些请求参数暴露在外面 正常项目工 ...
- IO流实现GBK写入文件然后转换UTF-8
public static void main(String[] args) throws IOException { File file = new File("olol\\a.txt&q ...
- git换行符自动转换导致整个文件被修改的解决方案
不少开发者可能遇到过这个问题:从git上拉取服务端代码,然后只修改了一处地方,准备提交时,用diff软件查看,却发现整个文件都被修改了.这是git自动转换换行符导致的问题. 原因 不同操作系统使用的换 ...