【Java工程师面试全攻略】Day7:分布式系统设计面试精要

一、分布式系统概述

分布式系统已成为现代互联网应用的标配架构,据LinkedIn统计,分布式系统设计能力是高级Java工程师薪资差异的关键因素。今天我们将深入解析分布式系统的核心理论和实践,帮助你掌握面试中的系统设计问题。

二、分布式理论基础

2.1 CAP理论详解

   Consistency▲│
A ·──┼──· P│▼Availability

实际应用场景:

系统类型选择典型案例
金融系统CPZooKeeper
社交网络APCassandra
电商系统CA(伪命题)MySQL集群

2.2 BASE理论

  • Basically Available(基本可用):允许部分失败
  • Soft state(软状态):中间状态允许存在
  • Eventually consistent(最终一致):数据最终达成一致

示例场景:

// 订单支付最终一致性实现
public void payOrder(Long orderId) {// 1. 本地事务:更新订单状态为"支付中"orderService.updateStatus(orderId, PAYING);// 2. 异步调用支付系统mqProducer.send(new PaymentMessage(orderId));// 3. 支付系统回调更新最终状态
}

三、分布式事务解决方案

3.1 常见方案对比

方案原理优点缺点适用场景
2PC协调者+参与者强一致阻塞、单点故障数据库层
TCCTry-Confirm-Cancel高可用开发复杂金融交易
本地消息表事务+异步消息简单可靠侵入业务订单系统
Saga事务拆分+补偿长事务支持难调试跨系统流程
Seata全局事务ID一站式解决方案性能损耗微服务架构

3.2 Seata实现原理

工作流程:

  1. TM开启全局事务
  2. RM注册分支事务
  3. TC协调事务提交/回滚
  4. 通过undo_log实现回滚
// Seata使用示例
@GlobalTransactional
public void purchase(Long userId, Long productId) {accountService.debit(userId, money);storageService.deduct(productId, count);orderService.create(userId, productId, count);
}

四、分布式缓存策略

4.1 缓存模式对比

模式写入策略读取策略优点缺点
Cache-Aside先DB后删缓存先缓存后DB简单可控可能不一致
Read-Through自动加载统一入口抽象性好实现复杂
Write-Through同步写缓存-强一致写入慢
Write-Behind异步写缓存-高性能可能丢失

4.2 缓存问题解决方案

缓存穿透:

// 布隆过滤器伪代码
public class BloomFilter {private BitSet bitset;public boolean mightContain(String key) {int[] hashes = hash(key);for (int hash : hashes) {if (!bitset.get(hash)) {return false;}}return true;}
}

缓存雪崩:

// 随机过期时间
public <T> T getWithRandomExpire(String key, Supplier<T> loader) {T value = cache.get(key);if (value == null) {value = loader.get();// 基础过期时间+随机偏移int expire = 3600 + new Random().nextInt(600); cache.set(key, value, expire);}return value;
}

五、服务治理

5.1 服务发现架构

[Service Instance] → Register → [Registry Center]↑                               ↓
[Client] ←─ Discover ←───────────────┘

主流方案对比:

  • Eureka:AP设计,适合Spring Cloud
  • ZooKeeper:CP设计,强一致但性能低
  • Nacos:支持AP/CP切换,功能全面
  • Consul:多数据中心支持,健康检查完善

5.2 负载均衡算法

算法描述适用场景
轮询(Round Robin)依次分配服务器性能均匀
加权轮询按权重分配服务器性能不均
随机随机选择简单场景
最小连接选择连接数最少的长连接服务
一致性哈希相同请求到同一节点缓存服务

六、消息队列应用

6.1 消息队列选型对比

特性KafkaRocketMQRabbitMQPulsar
设计目标日志处理金融交易企业集成流处理
吞吐量非常高非常高
延迟毫秒级毫秒级微秒级毫秒级
事务消息支持支持不支持支持
协议支持自定义自定义AMQP多协议

6.2 消息可靠性保障

生产者保证:

  1. 同步发送+重试机制
  2. 事务消息(如RocketMQ)
  3. 消息落库+定时任务补偿

消费者保证:

// RocketMQ消费者示例
consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {try {// 业务处理processMessage(msgs);return ConsumeOrderlyStatus.SUCCESS;} catch (Exception e) {// 记录日志,人工干预log.error("消费失败", e);return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;}
});

七、高频面试题解析

7.1 问题1:如何设计一个分布式ID生成器?

参考答案:

  1. UUID:简单但无序
  2. 数据库自增:需要中心化数据库
  3. Snowflake算法
    // 64位ID结构
    0 | 000...0000(41位时间戳) | 00000(5位数据中心ID) | 00000(5位机器ID) | 000...000(12位序列号)
    
  4. Redis INCR:利用原子操作
  5. Leaf算法:美团开源的分布式ID服务

7.2 问题2:如何保证微服务接口的幂等性?

解决方案:

  1. 唯一索引:防止重复数据
  2. 乐观锁
    UPDATE orders SET status = 'paid' WHERE id = 100 AND status = 'unpaid'
    
  3. Token机制
    // 1. 服务端生成token存入Redis
    String token = UUID.randomUUID().toString();
    redisTemplate.opsForValue().set("order:100:token", token, 5, TimeUnit.MINUTES);// 2. 客户端携带token请求
    // 3. 服务端校验后删除token
    
  4. 状态机:限制状态流转路径

八、系统设计实战

题目:设计一个秒杀系统

核心方案:

  1. 分层削峰

    • 前端:按钮置灰+验证码
    • 网关:限流(令牌桶算法)
    • 服务:队列缓冲+异步处理
  2. 热点隔离

    • 独立部署秒杀服务
    • Redis集群分片存储热点数据
  3. 库存扣减

    // Redis原子操作
    Long remain = redisTemplate.opsForValue().increment("seckill:stock:"+productId, -1);
    if (remain < 0) {// 回滚redisTemplate.opsForValue().increment("seckill:stock:"+productId, 1);throw new RuntimeException("库存不足");
    }
    
  4. 最终一致性

    @Transactional
    public void handleSeckill(Long userId, Long productId) {// 1. 扣减Redis库存// 2. 发送创建订单MQ// 3. 异步更新数据库
    }
    

九、明日预告

明天我们将探讨《高并发系统设计实战》,内容包括:

  • 性能压测方法论
  • 限流熔断策略
  • 降级方案设计
  • 高性能编码技巧
  • 真实案例解析

十、昨日思考题答案

问题:Spring Boot自动配置如何工作?

答案:

  1. 启动时加载META-INF/spring.factories中的EnableAutoConfiguration
  2. 通过@Conditional系列注解条件化装配Bean
  3. 主要条件注解包括:
    • @ConditionalOnClass:类路径存在时生效
    • @ConditionalOnMissingBean:容器中不存在时生效
    • @ConditionalOnProperty:配置属性匹配时生效

欢迎在评论区分享你的分布式系统设计经验,我们明天见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel处理控件Aspose.Cells教程:在Excel 文件中创建、操作和渲染时间线

您可以使用数据透视表时间轴&#xff0c;而无需调整过滤器来显示日期——这是一种动态过滤器选项&#xff0c;可让您轻松按日期/时间进行过滤&#xff0c;并使用滑块控件放大所需的时间段。Microsoft Excel 允许您通过选择数据透视表&#xff0c;然后单击“插入”>“时间轴”…

Python----神经网络发(神经网络发展历程)

年份网络名称突出点主要成就论文地址1989LeNet首个现代卷积神经网络&#xff08;CNN&#xff09;&#xff0c;引入卷积、池化操作手写数字识别先驱&#xff0c;奠定CNN基础MNIST Demos on Yann LeCuns website2012AlexNet首次大规模使用深度卷积神经网络进行图像识别&#xff1…

mvc与mvp

mvc MVC 架构中&#xff0c;Activity/Fragment&#xff08;作为 View 和 Controller&#xff09;直接持有 Model 或异步任务的引用&#xff0c;当页面销毁时&#xff0c;这些长生命周期对象若未正确释放&#xff0c;会导致 Activity 无法被 GC 回收&#xff0c;形成内存泄漏。…

商业智能中的地图可视化模板:助力数据高效呈现

引言 在数字化浪潮席卷的当下&#xff0c;数据可视化的重要性愈发凸显。企业和组织需要从海量的数据中提取有价值的信息&#xff0c;以便做出明智的决策。而可视化地图组件作为数据可视化的关键部分&#xff0c;能够将数据与地理位置相结合&#xff0c;以直观、美观的方式展示…

Opencv 相机标定相关API及原理介绍

Opencv 相机标定相关API及原理介绍 相机标定是计算机视觉中的基础任务,旨在确定相机的​​内参矩阵​​、​​畸变系数​​以及(可选)​​外参​​(相机相对于世界坐标系的旋转和平移)。OpenCV提供了完整的相机标定工具链,核心函数为cv2.calibrateCamera,其原理基于张正…

深入剖析AI大模型:Prompt 从理论框架到复杂任务的全场景实现

今天我们就Prompt实战&#xff0c;实现一下复杂场景&#xff0c;通过这些实战我们就可以更好的理解大模型工作的原理和机制了。我个人觉得Prompt是AI大模型中非常重要的的环节。首先我们还是温习一下Prompt的框架和基础原则。然后我们就文本生成、问答任务及复杂任务三个方面分…

Fractal Generative Models论文阅读笔记与代码分析

何恺明分型模型这篇文章在二月底上传到arXiv预出版网站到现在已经过了三个月&#xff0c;当时我也听说这篇文章时感觉是大有可为&#xff0c;但是几个月不知道忙啥了&#xff0c;可能错过很多机会&#xff0c;但是亡羊补牢嘛&#xff0c;而且截至目前&#xff0c;该文章应该也还…

IntelliJ IDEA代码提示忽略大小写设置详解

目录 前言一、设置步骤1. 打开设置界面2. 进入代码补全设置3. 配置大小写敏感选项新版本&#xff08;2023及以上&#xff09;旧版本&#xff08;2022及以下&#xff09; 4. 保存并应用设置 二、效果验证示例三、注意事项与常见问题1. **适用范围**2. **版本兼容性**3. **设置未…

Oracle集群OCR磁盘组掉盘问题处理

问题描述 填写问题的基础信息。 系统名称 - IP地址 - 操作系统 HP-UNIX 数据库 Oracle 11.2.0.4 两节点RAC 症状表现 问题的症状表现如下 集群的OCR磁盘组掉了一块盘(/dev/rdisk/disk52): 查询集群仲裁盘发现只有两块&#xff08;原来是有三块&#xff09;&#xff…

在WordPress中彻底关闭生成缩略图的方法

在WordPress中彻底关闭生成缩略图有多种方法&#xff0c;以下是几种常见的方法&#xff1a; 方法一&#xff1a;通过修改主题的functions.php文件 登录WordPress后台&#xff1a;进入WordPress后台管理界面。 编辑主题文件&#xff1a; 在左侧菜单中找到“外观”选项&#…

安全-Linux基线核查项点

Linux基线加固/整改 1.限制超级管理员远程登录 修改远程管理程序ssh的配置文件 vi /etc/ssh/sshd_config PermitRootLogin no 重启sshd服务 systemctl restart sshd 2. 修改默认密码生存周期 一个好的密码时间策略如下&#xff1a; vi /etc/login.defs PASS_MAX_DAY 90 最长…

在微信小程序中使用骨架屏

在微信小程序中使用骨架屏可以优化用户体验&#xff0c;避免页面加载时出现白屏现象。以下是详细的使用方法和注意事项&#xff1a; 使用方法 生成骨架屏代码&#xff1a; 打开微信开发者工具&#xff0c;进入需要添加骨架屏的页面。在模拟器面板右下角点击三个点&#xff0c…

网络的那些事——初级——OSPF(1)

&#x1f48e;什么是OSPF? OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;是一种基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;广泛应用于中大型企业及运营商网络。其核心设计目标是解决早期协议&#xff08;如RI…

前端导出PDF(适配ios Safari浏览器)

目前市面上常用的前端导出PDF库组合一般为&#xff1a; 1. html2canvas js-pdf 2. html2canvaspdf-lib 3. domtoimagepdf-lib 因本人项目中导出pdf需求为导出30页及以上的多页pdf&#xff0c;考虑性能问题&#xff0c;选择了 html2canvaspdf-lib 及domtoimagepdf-lib两种方…

physicsnemo开源程序是开源深度学习框架,用于使用最先进的 Physics-ML 方法构建、训练和微调深度学习模型

​一、软件介绍 文末提供程序和源码下载 NVIDIA PhysicsNeMo 是一个开源深度学习框架&#xff0c;用于使用最先进的 SciML 方法构建、训练、微调和推理物理 AI 模型&#xff0c;以实现 AI4 科学和工程。PhysicsNeMo 提供 python 模块来构建可扩展和优化的训练和推理管道&#…

JDBC接口开发指南

1.简介 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准&#xff0c;据此可以构建更高级的工具…

Shell 脚本:系统管理与任务自动化的利器

在开发者忙碌的日常工作中&#xff0c;效率就是生命线。当面对大量重复、繁琐的系统管理任务与开发流程时&#xff0c;一款得力的编程工具能让工作事半功倍。Shell 脚本&#xff0c;这把在 Linux 和 Unix 系统环境下闪耀着光芒的利器&#xff0c;凭借其强大的自动化能力&#x…

关于mybatis插入大批量数据效率问题

一、即便分批次用mybatis插入数据&#xff0c;效率依旧不高&#xff0c;原因&#xff1a; MyBatis一次性批量插入几千条数据&#xff0c;为什么性能很差&#xff1f;-腾讯云开发者社区-腾讯云 文中提出&#xff1a; 默认执行器类型为Simple&#xff0c;会为每个语句创建一个新…

在 JavaScript中编写 Appium 测试(入门)

1.编写一个测试 (JS) 要在 JavaScript&#xff08;Node.js&#xff09;中编写 Appium 测试&#xff0c;我们需要选择一个与 Appium 兼容的客户端 库。维护最好的库和 Appium 团队推荐使用的库是 WebdriverIO, 所有就让我们使用它吧。既然我们已经安装了 Appium&#xff0c;我们…

【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】

DeviceProperties、AdapterProperties、StorageModule、以及 bt_config.conf 是 AOSP Bluetooth 栈中 设备属性管理与持久化系统 的核心组成部分&#xff0c;它们之间关系紧密&#xff0c;但职责各有不同。 下面我将依次讲解它们的区别与联系. 注意: 在代码里面 还有 Blueto…