【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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86846.shtml
英文地址,請注明出處:http://en.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…