分布式锁
数据库的唯一索引
建立个表,搞个唯一索引(约束),把要操作的对象(比如id作为唯一约束)写入表。可以保证该记录只被插入一次,释放锁时删除这条记录。
非阻塞锁,如果解锁失败
Redis 的 SETNX 指令
- 上锁: SET resource_name my_random_value NX PX 30000
- 解锁: if get resource_name == my_random_value then del resource_name,不能直接del,因为resource_name可能已过期且被其他线程使用。
Redis的 RedLock 算法
保证在发生单点故障时仍然可用。
- 尝试从 N 个相互独立 Redis 实例获取一大半锁
- 耗时小于锁的过期时间就为成功
- 失败就释放已上锁的
Zookeeper
分布式事务
涉及到操作多个数据库
消息队列
下单后push消息到消息队列,库存这边需要pull消息
2PC
两阶段提交协议,保证了事务的原子性。
下单,减存,各自执行但都没提交,等第三方协调者确认所有参与者都执行成功后下达提交指令。
协调者故障导致参与者阻塞,网络导致消息不通
CAP
分布式系统最多满足两个,AC二选一
一致性 Consistency
数据一致更新,所有副本变动都是同步的
可用性 Availability
好的响应性能
分区容忍性 Partition
节点分成几个区后,某些挂了,其他仍要继续提供服务。可靠性
BASE
BASE 理论是对 CAP 中一致性和可用性权衡的结果,它的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
基本可用
Basically Available
指分布式系统在出现故障的时候,保证核心可用,允许损失部分可用性。
例如,电商在做促销时,为了保证购物系统的稳定性,部分消费者可能会被引导到一个降级的页面。
软状态
Soft State
指允许系统中的数据存在中间状态,并认为该中间状态不会影响系统整体可用性,即允许系统不同节点的数据副本之间进行同步的过程存在时延。
最终一致性
Eventually Consistent
数据副本,在经过一段时间的同步后,最终能达到一致的状态。
ACID 要求强一致性,通常运用在传统的数据库系统上。
BASE 要求最终一致性,通过牺牲强一致性来达到可用性,通常运用在大型分布式系统中。
在实际的分布式场景中,不同业务单元和组件对一致性的要求是不同的,因此 ACID 和 BASE 往往会结合在一起使用。
Paxos
让参与分布式处理的每个参与者逐步达成一致意见
- 提议者
- 接受者
多对多关系,两个阶段:
- 准备:提议者群发序号,接受者群收并记录最大值max
- 接受:提议者群发[序号,内容],对于某个接受者,若收到的序号 < max,否定,否则接收。
提议者从众,若在准备阶段被反馈有同人提议被接受,从之,若多人,从最大。
接受者从认序号,第二阶段才正式接受
如何浅显易懂地解说 Paxos 的算法
- 可终止性: 从众
- 正确性:接受者只接收一个意见
Raft
通过集群方式,为客户提供强一致、高可靠的数据服务
- 1个Leader n个Follower
- Leader接受客户端请求,并命令Follower一起来做
- 一半的以上回复OK才commint日志
- Leader一直发送心跳信息给Follower
- Follower等随机秒后收不到心跳就变为Candidate进行竞选,投自己,再拉票,一个一票
- 因为是随机秒,所以不会同时竞选,拉票信息随机延迟
- 票数过半为胜者,成Leader,其他为Follower
- Leader负责一致性检查,Follower要保证与其一致,否则将来竞选时可能被更新结点拒绝。
实践
负载均衡的算法与实现
- 加权最小连接
- DNS
- MAC
- IP
- HTTP重定向
分布式session
- 把client固定到server,一旦故障session全丢
- Session 复制,一旦变化就广播,优化方案(Terracotta只广播改动的部分)
- Memcached或数据库
高并发下的性能优化
- 调整项目结构,增加服务器资源,集群或分布式,负载均衡
- 数据库优化
- 代码优化(使用多线程+算法优化)
- 合理使用缓存
- html静态化,图片存于服务器
接口如何处理重复请求
- 前端 disable
- 后端 redis分布式锁
接口限流
计数器法,1分钟100,临界时间点
滑动窗口,将时间细分为很多格,每过n秒向右移动n格
漏桶算法 令牌桶算法
分布式缓存
https://github.com/crossoverJie/JCSprout/blob/master/MD/Cache-design.md