分布式 知识点和方案 (详解在注释里面,图片加载需要时间)
2023-07-04 09:29:27 0 举报
AI智能生成
知识要点和原理解析,详细信息和图片均在黄色图标的注释中,鼠标移动到黄色图标上即会显示,图片加载有时较慢。
作者其他创作
大纲/内容
分布式ID
SnowFlake 雪花算法
分布式理论
CAP 定理
分区容错性:Partition tolerance
一致性:Consistency
可用性:Availability
Consistency 和 Availability 的矛盾
BASE 理论
基本可用(BasicallyAvailable)
软状态(SoftState)
最终一致性(EventualConsistency)
分布式事务的几种解决方案
分布式事务的实现方式
刚性事务
二阶提交 (2PC)
核心原理
第一阶段
第二阶段
commit
Rollback
缺陷
第一,在整个流程中,我们会发现各个资源管理器节点存在阻塞
第二,仍然存在数据不一致的可能性
第三,单点故障
限制
它主要用在两个数据库之间
三阶提交 (3PC)
核心原理
第一,CanCommit 阶段
第二,PreCommit 阶段
第三,DoCommit 阶段
与2PC的区别
柔型事务
事务补偿机制 (TCC)
图示
核心
缺点
示例
异常处理
幂等控制:去重表
空回滚:事务分支表+判空
防悬挂:事务控制记录表+判断
TCC特点
不与特定的服务框架耦合
支持多种事务日志持久化机制
支持可配置recovery策略
TCC与2PC(两阶段提交)区别
TCC位于业务服务层,并非2pc在数据库的资源层
2pc没有单独的准备阶段,而try兼顾资源操作与准备两方面
TCC的try操作可以以业务确定粒度,即灵活选择资源的锁定粒度
TCC开发成本高
可靠消息最终一致性事务
利用消息中间件完成
需解决的问题
1、本地事务与消息发送的原子性问题
2、事务参与方接收消息的可靠性
3、消息重复消费的问题
方案
1、本地消息表方案
核心思想
示例:注册送积分
优缺点
优点
缺点
2、可靠消息服务
生产者
消费者
总结
如何保证生产者服务对消息的可靠投递
如何保证消费者服务器对消息的可靠接收
3、分布式消息中间件( RocketMQ)
两个阶段
prepare阶段
确认阶段
ACK机制
流程
使用
问题
是否任何情况下MQ的事务性消息都可以保证双方的最终一致性?
示例:交易链路
事务执行
XA 规范
图示
事务协调者(Transaction Manager)
资源管理器(Resource Manager)
XA执行流程
XA的缺点
性能不理想
Seata实现
Seata 中的 XA 模式
实现
XA 的几个问题
数据锁定
协议阻塞
性能差
与同为业务无侵入的 AT 模式比较
Seata AT(TXC) 模式
工作流程
第一阶段
第二阶段
AT 模式二阶段提交
AT 模式二阶段回滚
Seata AT模式优劣
亮点
劣势
性能损耗
补偿型事务模式的问题
对比XA
AT 模式性能优势主要在于
AT与 XA 的差别在什么地方?
架构层次
两阶段提交
XA 的 2PC 过程
AT 的 2PC 过程
分布式锁
mysql实现分布式可重入锁
核心逻辑
实现
基于唯一索引(insert)实现
实现方式
简单实现方案
完善实现方案
获取锁
超时检测和强制释放
释放锁
为什么要根据 id 而不是根据 name 释放锁?
基于排他锁(for update)实现
伪代码
优缺点
乐观锁实现
具体实现
ABA问题
缺点
注意点
优缺点
redis实现可重入分布式锁
1、加锁Lua脚本
脚本入参
脚本内容
脚本解读
2、解锁Lua脚本
脚本入参
脚本内容
脚本解读
Redission分布式锁
加锁-lock
代码实现
lock()
tryLockInnerAsync方法
lock加锁的调用逻辑图
watchdog机制
scheduleExpirationRenewal
addThreadId()
renewExpiration()
标号为 ④
标号为 ①、②
怎么判断是否有效呢?
标号为 ③
renewExpirationAsync
会有什么异常呢?
如果执行 renewExpirationAsync 方法的时候没有异常。这个时候的返回值就是 true 或者 false。
一旦触发看门狗机制,触发 renewExpiration 方法的线程就会变成定时任务的线程。
服务器宕机了?
解锁-unlock
unlockAsync
unlockInnerAsync
图示
cancelExpirationRenewal(threadId); 方法
问题
如何实现超时自动释放锁?
加锁失败之后如何实现阻塞等待加锁?
如何实现阻塞等待一定时间还未加锁成功就放弃加锁
超时放弃加锁的方法
如何使用公平锁?
如何实现读写锁
Redisson是如何具体实现读写锁的呢?
如何实现批量加锁(联锁)
Redis分布式锁存在的问题
举个例子
如何实现RedLock算法
客户端执行步骤
RedLock算法的实现
zk可重入分布式锁
流程图
加锁源码解析
acquire方法
internalLock方法
attemptLock方法
createsTheLock()
internalLockLoop方法
getsTheLock()
如何实现可重入加锁
加锁失败之后如何实现阻塞等待加锁
流程图
如何实现阻塞等待一定时间还未加锁成功就放弃加锁
如何实现公平锁
如何实现读写锁
加锁小结
流程图
释放锁release方法
缺点
ZK分布式锁和Redis分布式锁到底该选谁
一致性哈希
基础类型的Hash
缺点
虚拟节点
示例
0 条评论
下一页