java面试题(八),现在都这么卷了,八股文还适用吗?

文章目录


一、数据存储

1. 一致性哈希算法解决节点扩缩容的原理?

一致性哈希通过环形呼吸空间将节点和数据映射到同一虚拟换,采用一下机制实现高效扩缩容。
节点动态伸缩:新增节点时仅需迁移相邻节点部分数据,删除节点时数据自动迁移到下一个相邻节点,平均仅需迁移K/n数据量。
虚拟机节点技术:通过多个物理节点创建多个虚拟机节点,均匀分散数据负载,避免节点增减时因哈希环分布不均导致的数据倾斜问题

2. 分库分表策略(水平拆分/垂直拆分)及分片键选择?

垂直拆分:
分库:按业务模块拆分(如用户库、订单库),降低耦合性
分表:将大表按照字段拆分(高频字段与低频字段分离),减少单行数据量,提升查询效率
水平拆分:
分表:按分片规则(如哈希、范围)将数据分散到多表,解决单标数据量过大的性能瓶颈

3. 主从复制与多主复制的优缺点对比?

维度 主从复制 多主复制
写入节点 单主节点写入 多节点同时写入
一致性 强一致性(同步复制) 最终一致性(异步居多)
可用性 主节点单故障需切换(较高延迟) 多节点冗余(高可用)
冲突处理 无冲突风险 需额外机制解决写入冲突

4. 分布式数据库(如TiDB、Cassandra)与关系型数据库的核心差异?

特性 分布式数据库(如TiDB) 关系型数据库(MySQL)
扩展性 水平扩展(无上限) 垂直扩展(硬件限制)
事务模型 支持分布式事务(Percolator模型) 仅本地事务(ACID)
一致性 灵活选择(强一致/最终一致) 强一致性
架构复杂度 高(需管理多节点协同) 低(单机或主从架构)

5. 数据副本同步机制(同步复制/异步复制)?

同步复制:数据写入需所有副本确认,保证强一致性,但延迟高,可用性低(节点故障导致阻塞)
异步复制:数据写入主节点后立即返回,副本异步同步,延迟低且可用性高,但存在数据丢失风险

6. 分布式事务与本地事务的差异?

‌类型‌ ‌ 事务范围‌ ‌性能‌ ‌一致性保障‌
‌本地事务‌ 单数据库内操作 ACID(强一致性)
‌分布式事务‌ 跨多个数据库/服务 基于协议(如2PC/TCC)

7. 分布式锁的实现方案对比(Redis/Zookeeper/数据库)?

方案 实现原理 优点 缺点
Redis SETNX+过期时间 高性能、低延迟 非强一致性(异步复制漏洞)
Zookeeper 临时顺序节点监听 强一致性、可靠性高 性能较低(频繁节点操作)
数据库 唯一索引/乐观锁 实现简单 性能差、锁表风险高

8. 分布式系统如何解决数据倾斜问题?

虚拟节点技术:一致性哈希中物理节点分配多个虚拟节点,分散热点数据
动态分片技术:分局负载自动迁移分片(如Cassandra的副本策略)
分片键优化:选择离散型更高的字段,避免哈希倾斜

9. 数据冷热分离的设计策略?

存储分层:热数据存储于SSD/内存,冷数据迁移至HDD/归档存储
访问分离:高频查询走热表(如近期订单),低频查询走冷表(如历史日志)
自动化策略:基于时间或访问频率规则自动迁移数据(Elasticsearch声明周期管理)

10. 分布式文件系统(如HDFS、Ceph)的核心设计思想?

分块存储:文件切分为固定大小快,分散存储于多借点
冗余备份:每个数据块存多副本(如HDFS默认3副本),保障容灾能力
元数据备份:中心化(如HDFS nameNode)或去中心化(如Ceph CRUSH算法)管理文件位置

11. 缓存与数据库双写一致性问题解决方案?

‌更新顺序策略‌
‌先更新数据库再删除缓存‌:避免并发读写导致缓存旧数据,但需确保缓存删除成功(失败时引入重试机制或消息队列)。
延迟双删‌:在数据库更新后延迟二次删除缓存,减少主从同步延迟导致的脏数据。
‌异步补偿机制‌
‌基于binlog监听‌(如Canal):捕获数据库变更日志,异步更新或删除缓存,实现最终一致性。
‌消息队列重试‌:缓存删除失败时,通过消息队列异步重试,确保操作最终成功。
‌强一致性方案‌
‌加分布式锁‌:在更新数据库和缓存时加锁,防止并发冲突,但牺牲性能

12. 布隆过滤器的原理及在分布式系统中的应用?

原理:使用伪数组和多个哈希函数,将元素映射到位数组的多个位置,判断元素是否存在
应用场景
缓存穿透防护:拦截不存在的数据请求,避免大量无效查询穿透到数据库
分布式去重:判断你数据是否已处理,如消息队列中重复消息过滤

13. 分布式存储系统的数据分片策略(Range/Hash)?

‌Range分片‌
‌按范围划分‌(如按时间、ID区间),适合范围查询,但可能因数据分布不均导致热点。
‌Hash分片‌
‌哈希取模或一致性哈希‌:数据均匀分布,离散性好,但范围查询效率低。
‌组合策略‌
‌Hash+Range混合‌:如Cassandra支持按分区键Hash分片,再按聚簇键Range排序。

14. 分布式系统如何实现数据压缩与编码优化?

列式存储压缩‌:同一列数据重复性高,适合使用RLE、字典编码等压缩算法。
‌时序数据优化‌
‌Delta编码‌:存储时间戳差值而非绝对值。
‌Gorilla压缩‌:针对浮点数的高效压缩

15. 分布式KV存储(如Redis Cluster)的槽位分配机制?

虚拟槽分区:将数据划分为16384个槽,节点负责部分槽位,扩缩容近千亿受影响槽数据
Gossip协议:节点间通过P2P通信槽位分配信息,实现去中心化管理

16. 时序数据库(如InfluxDB)的存储优化策略?

时间分区:按时间窗口划分数据,提升时间范围查询效率
数据降采样:对历史数据按低精度聚合存储,减少存储量和查询开销

17. 分布式系统如何实现数据版本控制?

向量时钟:记录多个节点的版本时序,解决冲突时合并版本
MVCC多版本并发控制:为每条数据维护多个版本,读操作访问特定版本,写操作生成新版本。

18. 数据迁移方案设计(全量+增量)?

‌全量迁移‌:
初始阶段通过快照同步存量数据,期间暂停写入保证一致性。
‌增量迁移‌:
基于binlog或CDC工具(如Debezium)实时同步增量数据。

19. 分布式系统如何实现数据去重?

哈希指纹:对数据生成唯一哈希值,通过比对哈希值判断重复
布隆过滤器:快速判断数据是否存在,适用于海量数据去重(允许少量误判)

20. 分布式事务中的最终一致性实现方案?

异步通知:基于消息机制(如RocketMQ事务消息,保证个服务最终执行 成功)
补偿机制:TCC模式,TRY预留资源,Confirm提交,Cancel回滚,通过重试保证最终一致

21. 分布式消息队列(如Kafka、RocketMQ)的存储设计?

分区存储:数据按Topic分区,每个分区顺序追加写入,支持高吞吐量
分段日志:将数据拆分为多个Segment文件,过期数据自动清理

22. 分布式搜索引擎(如Elasticsearch)的分片与副本机制?

分片策略:索引数据分为多个分片,支持水平扩展
副本机制:每个分片有多个副本,保障高可用与负载均衡

23. 分布式系统如何实现数据备份与恢复?

多副本存储:数据写入多个节点(如HDFS 3副本),单点故障时自动切换
快照备份:定期生成全量快照,结合增量日志实现快速回复

24. 分布式数据库的MVCC实现原理?

版本链管理:每条数据维护多个版本,通过事务ID判断可见性
垃圾回收:定期清理无活跃事务引用的旧版本数据


二、分布式事务

1. 二阶段提交(2PC)流程及单点故障风险?

执行流程
准备阶段:协调者向所有参与者发送事务预处理请求,参与者执行本地事务并记录Undo/Redo日志,反馈Yes/No响应
提交阶段:若所有参与者均返回Yes,协调者发送Commit指令;否则发送Rollback指令,参与者根据指令提交或回滚事务
单点故障风险
协调者宕机:若协调者在提交件阶段故障,参与者将永久阻塞,等待指令超时,导致资源所无法释放
数据不一致:网络分区时部分参与者可能提交成功,另一部分未收到Commit指令,导致状态分裂

2. 三阶段提交(3PC)如何优化2PC的阻塞问题?

流程改进
CanCommit阶段:协调者询问参与者是否具备执行条件,避免资源浪费
PreCommit阶段:参与者预提交事务并锁定资源,但未持久化结果
DoCommit阶段:协调者最终决策,参与者超时未收到指令则自动提交
优化效果
超时机制:参与者在PreCommit阶段后若超时未收到指令,默认提交事务,降低阻塞概率

3. TCC补偿机制的执行流程(Try/Confirm/Cancel)?

Try阶段:资源预留(如冻结库存),生成中间态数据)。
‌Confirm阶段‌:Try成功时执行最终提交(如扣减库存)。
‌Cancel阶段‌:Try失败时回滚预留资源(如释放库存)。

4. 基于消息队列的最终一致性方案(本地消息表/事务消息)?

本地消息表:业务与消息记录在同一本地事务中,通过定时任务重试投递消息之MQ,确保最终一致。
事务消息:消息暂存MQ服务器,业务执行成功后确认投递(如RocketMQ两阶段提交)。

5. Saga事务模式的长事务处理策略?

事务拆分:将长事务拆分为多个子事务,每个子事务定义对应的补偿操作(正向服务+逆向回回滚)
执行方式
协同式:由协调器同一调度子事务执行与补偿
编排式:通过时间驱动链式触发子事务,失败时反向触发补偿

6. 最大努力通知型事务的实现原理?

异步通知:业务执行后通过MQ异步通知下游,失败时按策略重试
对账机制:定期核对数据状态,修复不一致记录

7. XA协议与柔性事务的对比?

维度 XA协议(强一致性) 柔性事务(如TCC)
一致性 强一致性(基于2PC实现) 最终一致性
性能 低(同步阻塞、资源锁) 高(异步、无锁)
适用场景 短事务、低并发 高并发、长事务

8. 分布式事务中的幂等性保障方案?

唯一标识:为每个操作分配全局唯一ID,通过去重表或Redis校验重复请求
状态机:业务操作设计为状态流转,仅允许状态合法变更(如订单状态:已支付-已完成)

9. 分布式事务超时与重试机制设计?

超时控制:协调者与参与者设置事务超时阈值,超时后自动触发回滚
重试策略:
指数蜕变:失败后延迟时间逐步增加(如1s-2s-4s),避免雪崩

10. Seata框架的AT模式实现原理?

阶段一(提交前):
执行业务SQL生成行锁,记录SQL执行前后镜像数据到UndoLog
阶段二(提交/回滚)
提交:异步删除Undo Log,释放锁
回滚:根据Undo Log反向补偿数据,保证原子性

11. 分布式事务中的悬挂问题与空回滚问题解决方案?

空回滚问题
定义:未执行Try阶段的情况下直接触发Cancle回滚操作
解决方案:
幂等性检查:Cancle阶段校验Try是否回滚(如通过事务状态控制表),未执行则跳过回滚逻辑
全局事务状态标记:记录事务执行阶段(INIT/CONFIRMED/ROLLBACKED),仅在Try成功时允许Cancle操作

悬挂问题:
定义:Try请求晚于Cancel到达参与者,导致资源预留后无法提交或回滚
解决方案:
时序控制:为每个事务绑定唯一ID,在Try阶段教育是否已存在Cancel几率,若存在则拒绝执行
事务状态预判:通过全局事务日志判断分支事务是否已终止,避免执行已回滚的Try操作

12. 业务侵入型事务与非侵入型事务的对比?

维度 业务侵入型(如TCC/Saga) 非侵入性(如Seata AT/XA)
代码耦合度 需显式编写Try/Confirm/Cancel逻辑 框架自动代理SQL,业务无感知
适用场景 复杂业务补偿逻辑(如库存扣减) 简单事务场景(如数据库原生事务)
性能 高(资源预留异步化) 低(依赖全局锁同步阻塞)

13. 分布式事务如何实现资源预留?

TCC模式
Try阶段:冻结资源(如账户金额),生成中间态数据并记录事务日志
Saga模式
正向子事务:直接提交资源操作,失败时触发逆向补偿操作
本地消息表
业务与消息记录在同一个本地事务中,保证消息投递与资源操作原子性

14. 分布式事务的全局锁设计策略?

Seata AT模式:通过全局锁(行锁)隔离事务,避免脏写
XA协议:基于两阶段锁(2PL),在Prepare阶段锁定资源直至提交或回滚
乐观锁:使用版本号或时间戳校验数据变更,冲突时回滚重试

15. 分布式事务中的协调者高可用方案?

集群部署:协调者(如Seata TC)采用多节点集群,通过负载均衡分散请求
RAFT共识算法:协调者状态同步采用RAFT协议,保证故障时快速切换主节点
数据持久化:全局事务日志存储于高可用数据库(如MySQL集群)

16. 分布式事务与业务校验的协同设计?

校验前置:在Try阶段完成业务规则校验(如库存充足性,避免Confirm阶段失败)
补偿兼容性:逆向操作需兼容正向操作的中间状态(如冻结金额需支持多次回滚)

17. 分布式事务如何实现跨服务的数据一致性?

TCC模式:通过Try预留资源、Confirm提交资源、Cancel释放资源实现跨服务原子性
Saga模式:链式调用子事务,失败时反向执行补偿操作
事务消息:基于MQ的最终一致性(如RocketMQ事务消息)确保上下游数据同步

18. 事务消息的可靠投递机制(如RocketMQ事务消息)?

半消息机制:消息暂存MQ服务器,业务执行成功再投递给消费者
事务状态会差:MQ定期查询生产者本地事务状态,超时未确认则回滚消息
本地事务绑定:业务操作与消息记录在同一个本地事务中,保证原子性

19. 分布式事务性能优化策略(如异步提交)?

异步提交:Confirm/Cancel阶段异步执行,减少事务链路耗时(如Seata TCC异步化)
资源预留精简:仅锁定关键资源(如库存行级锁),避免全表锁竞争
批量处理:合并多个事务操作(如批量扣减库存),减少网络开销
锁粒度优化:使用细粒度所(如行锁代替表锁),提升并发处理能力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值