推荐:
分布式中的2大难题:分布式锁 、分布式事务
3高:高可用、高并发、高扩展
系统怎么做3高 ? 3高项目设计原则?
场景:看京东加载js的时候,url上js中间有逗号,尽量减少请求
4要
:
- 数据量要少
- 请求数要少
- 路径要短
- 依赖要少
1不要
:
- 不要单点
识别热点数据?
场景:1亿茅台添加到购物车
技术
:uv、pv业务
:计算提前添加购物车数量最多的商品
处理热点数据?
场景:1亿茅台添加到购物车
优化
:服务器的代码、连接数、业务逻辑限制
:消息队列(限制每次的数量)、业务限制(比如你比别人多浏览详情就优先,比如根据用户名来限制,本次请求只处理包含a的用户)隔离
:流量大分配更多的资源(30个商品,1个商品用1台redis,剩下29个商品用1台redis)
削峰?
场景:平常1w人,一下子1亿人
解决方案:
排队
100排队,第101就等着(例如:下雨天滴滴打车,要排队)答题
:答了一道,才能答下一道分层过滤
:一层一层过滤流量评估
:qps tps
保证系统?
稳
(高可用
) ——负载均衡准
(数据一致性
) ——分布式锁、分布式事务快
(高性能
) ——提升cpu性能、减少线程的等待时间
一般系统瓶颈地方?
场景:
数据库
原因:IO
解决:减少IO,在代码中减少序列化,并发读的优化(读缓存
)
解决数据一致性?
核心:防止少卖超卖(锁,引入第三方)
少卖?
场景:10个商品,12个人,前10个人拿到锁,后2个人拿不到锁直接抛弃,可能10个中有1个失败,结果就是只卖了9个
解决:重试,阻塞,队列
超卖?
场景:100个线程,同时查询都是10个库存,然后执行下单操作,结果有了100个订单
解决:加锁
锁
集群服务:服务A1、A2
单体服务:jvm锁——Synchronised、 lock
集群服务:请求先到负载均衡 ,然后再负载到其中一个服务,用第三方的锁
用第三方的锁?
原因:
- 是为了保证锁的互斥
- A1有自己的锁,A2有自己的锁,2个服务运行过程中互相拿不到对方的
用第三方的事务协调器?
- 是为了保证共同的事务
场景:请求购买,访问订单服务,订单完成后,访问积分服务,但积分服务故障了
结果:订单数据和积分数据不一致
分布式2阶段
- 1.投票阶段:预执行sql
- 2.执行阶段:提交或回滚
场景:第三方决定2个服务都提交,但这时其中一个服务器挂了(网络断了)?
解决:
- 1.重试
- 2.补偿——写脚本(2个服务的数据不一致,确定以哪个服务为准,处理哪个时间段的数据)
脚本跟事务执行会冲突么?
- 不一定要实时执行脚本
- 指定时间段的数据
base理论
保证数据的最终一致性 , 可以用队列MQ
TCC
try:提交执行
confirm:确定commit
cancel:确定rollback
confirm和cancle:2个互斥,要么confirm ,要么calcel
TCC VS 2阶段
2阶段:占用资源,不能放掉数据库链接,要不然没办法提交
TCC:不占用资源
鸵鸟算法?
分布式锁:互斥
- mysql :唯一索引、主键
- redis :setnx key (如果没有key拿锁,如果有就拿不到锁)
- zk:顺序临时节点
死锁?
- mysql:设置
有效期
(开始-结束) - redis:设置
过期时间
- zk:连接断了就断了