这里是码农充电第一站,回复“666”,获取一份专属大礼包
真爱,请设置“星标”或点个“在看”
转自:乐知者,
链接:cnblogs.com/expiator/p/10201004.html
分布式分为分布式缓存(Redis)、分布式锁(Redis 或 Zookeeper)、分布式服务(Dubbo 或 SpringCloud)、分布式服务协调(Zookeeper)、分布式消息队列(Kafka 、RabbitMq)、分布式 Session 、分布式事务、分布式搜索(Elasticsearch)等。不可能所有分布式内容都熟悉,一定要在某个领域有所专长。
分布式理论
问:分布式有哪些理论?
CAP 、BASE。分布式 CAP 理论,任何一个分布式系统都无法同时满足 Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性) 这三个基本需求。最多只能满足其中两项。而 Partition tolerance(分区容错性) 是必须的,因此一般是 CP ,或者 AP。
问:你怎么理解分布式一致性?
数据一致性通常指关联数据之间的逻辑关系是否正确和完整。在分布式系统中,数据一致性往往指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。
一致性还分为强一致性,弱一致性,还有最终一致性。强一致性就是马上就保持一致。
最终一致性是指经过一段时间后,可以保持一致。
分布式事务
问:你怎么理解分布式事务?分布式事务的协议有哪些?
分布式事务是指会涉及到操作多个数据库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务类型:二阶段提交 2PC ,三阶段提交 3PC。
-
2PC :第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。
-
3PC :三个阶段:CanCommit 、PreCommit 、DoCommit。
问:分布式事务的解决方案有哪些?
分布式事务解决方案:补偿机制 TCC 、XA 、消息队列 MQ。
问:讲一下 TCC。
**T(Try)**锁资源:锁定某个资源,设置一个预备类的状态,冻结部分数据。
-
比如,订单的支付状态,先把状态修改为"支付中(PAYING)"。
-
比如,本来库存数量是 100 ,现在卖出了 2 个,不要直接扣减这个库存。在一个单独的冻结库存的字段,比如 prepare _ remove _ stock 字段,设置一个 2。也就是说,有 2 个库存是给冻结了。
-
积分服务的也是同理,别直接给用户增加会员积分。你可以先在积分表里的一个预增加积分字段加入积分。
-
比如:用户积分原本是 1190 ,现在要增加 10 个积分,别直接 1190 + 10 = 1200 个积分啊!你可以保持积分为 1190 不变,在一个预增加字段里,比如说 prepare _ add _ credit 字段,设置一个 10 ,表示有 10 个积分准备增加。
C(Confirm):在各个服务里引入了一个 TCC 分布式事务的框架,事务管理器可以感知到各个服务的 Try 操作是否都成功了。假如都成功了, TCC 分布式事务框架会控制进入 TCC 下一个阶段,第一个 C 阶段,也就是 Confirm 阶段。此时,需要把 Try 阶段锁住的资源进行处理。
-
比如,把订单的状态设置为“已支付(Payed)”。
-
比如,扣除掉相应的库存。
-
比如,增加用户积分。
C(Cancel):在 Try 阶段,假如某个服务执行出错,比如积分服务执行出错了,那么服务内的 TCC 事务框架是可以感知到的,然后它会决定对整个 TCC 分布式事务进行回滚。
TCC 分布式事务框架只要感知到了任何一个服务的 Try 逻辑失败了,就会跟各个服务内的 TCC 分布式事务框架进行通信,然后调用各个服务的 Cancel 逻辑。也就是说,会执行各个服务的第二个 C 阶段, Cancel 阶段。
-
比如,订单的支付状态,先把状态修改为" closed "状态。
-
比如,冻结库存的字段, prepare _ remove _ stock 字段,将冻结的库存 2 清零。
-
比如,预增加积分的字段, prepare _ add _ credit 字段,将准备增加的积分 10 清零。
问:事务管理器宕掉了,怎么办?
做冗余,设置多个事务管理器,一个宕掉了,其他的还可以用。
问:怎么保证分布式系统的幂等性?
状态机制。版本号机制。
Redis
问:Redis 有哪些优势?
-
速度快,因为数据存在内存中。
-
支持丰富数据类型,支持 string、list、set 、sorted set、hash。
-
支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
-
丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除。
-
单线程,单进程,采用 IO 多路复用技术。
问:Redis 的存储结构是怎样的?
key-value 键值对。
问:Redis 支持哪些数据结构?
string(字符串), hash(哈希), list(队列), set(集合)及 zset(sorted set 有序集合)。
问:Redis 的数据结构,有哪些应用场景?
-
string:简单地 get / set 缓存。
-
hash:可以缓存用户资料。比如命令:hmset user1 name “lin” sex “male” age “25” ,缓存用户 user1 的资料,姓名为 lin ,性别为男,年龄 25。
-
list:可以做队列。往 list 队列里面 push 数据,然后再 pop 出来。
-
zset:可以用来做排行榜。
问:Redis 的数据结构,底层分别是由什么实现的?
-
Redis 字符串,却不是 C 语言中的字符串(即以空字符 ’\0’ 结尾的字符数组)&#x