?個人博客:Pandaconda-CSDN博客
📣專欄地址:https://blog.csdn.net/newin2020/category_12903849.html
📚專欄簡介:在這個專欄中,我將會分享后端開發面試中常見的面試題給大家,每天的題目都是獨立且隨機的,之前的面試題不會影響接下來的學習~
??如果有收獲的話,歡迎點贊👍收藏📁,您的支持就是我創作的最大動力💪
題目 1: 什么是緩存穿透、緩存擊穿和緩存雪崩?如何解決這些問題?
答案:
緩存是提高系統性能的重要手段,但在實際使用中可能會遇到以下三種問題:
-
緩存穿透
- 定義:查詢一個不存在的數據,緩存和數據庫都沒有命中,導致請求直接打到數據庫。
- 解決方案:
- 使用布隆過濾器(Bloom Filter)提前過濾掉無效的查詢請求。
- 對于空結果也設置緩存,并設置較短的過期時間。
-
緩存擊穿
- 定義:某個熱點數據在緩存中失效時,大量請求同時打到數據庫,造成數據庫壓力驟增。
- 解決方案:
- 設置熱點數據永不過期。
- 使用互斥鎖(如 Redis 的分布式鎖)確保只有一個請求加載數據到緩存,其他請求等待。
-
緩存雪崩
- 定義:大量緩存在同一時間失效,導致所有請求都打到數據庫,引發系統崩潰。
- 解決方案:
- 給緩存設置隨機的過期時間,避免同時失效。
- 增加多級緩存(如本地緩存 + 分布式緩存)。
- 在緩存失效時啟動降級策略(如返回默認值或靜態頁面)。
題目 2: 如何設計一個分布式任務調度系統?請描述核心組件和實現思路。
答案:
分布式任務調度系統用于在分布式環境中協調和執行定時任務,以下是其核心組件和實現思路:
核心組件:
-
任務管理模塊
負責任務的注冊、配置和狀態管理,包括任務名稱、執行時間、執行頻率等信息。 -
調度器 (Scheduler)
根據任務的執行時間和頻率,觸發任務的執行。可以使用時間輪算法或優先隊列實現高效的調度。 -
執行器 (Executor)
實際執行任務邏輯的組件,分布在不同的節點上,支持水平擴展。 -
分布式協調模塊
使用分布式協調工具(如 Zookeeper 或 Consul)確保任務在多個節點之間只被一個節點執行。 -
監控與報警模塊
記錄任務的執行日志、狀態和性能指標,并在任務失敗時發送報警通知。
實現思路:
-
任務分發
調度器將任務分配給可用的執行器,確保負載均衡。 -
任務冪等性
確保任務即使被多次執行也不會產生副作用。 -
容錯機制
如果某個執行器宕機,調度器需重新分配任務到其他節點。 -
動態擴展
支持動態添加或移除執行器節點,無需重啟系統。
示例:
使用 Quartz 配合 Redis 實現分布式任務調度:
- Quartz 負責任務的調度邏輯。
- Redis 存儲任務的狀態和鎖,確保任務的唯一性和一致性。
題目 3: 什么是消息隊列?它的作用是什么?常見的消息隊列有哪些?
答案:
消息隊列是一種異步通信機制,用于在分布式系統中傳遞消息,解耦生產者和消費者。
作用:
-
解耦
生產者和消費者之間通過消息隊列進行通信,彼此無需直接依賴。 -
異步處理
將耗時操作放入消息隊列,消費者異步處理,提升系統的響應速度。 -
削峰填谷
在高并發場景下,消息隊列可以緩沖流量,避免下游系統過載。 -
可靠性
消息隊列支持持久化存儲,確保消息不會因系統故障而丟失。
常見的消息隊列:
-
RabbitMQ
- 特點:支持多種協議(如 AMQP),功能強大,適合復雜的路由場景。
- 應用場景:金融系統、訂單處理。
-
Kafka
- 特點:高吞吐量,適合大規模數據流處理。
- 應用場景:日志收集、實時數據分析。
-
RocketMQ
- 特點:高性能,支持事務消息,適合電商等對可靠性要求高的場景。
- 應用場景:訂單系統、庫存管理。
-
ActiveMQ
- 特點:成熟穩定,支持 JMS 協議。
- 應用場景:傳統企業級應用。
選擇建議:
根據業務需求選擇合適的消息隊列,例如高吞吐量場景選擇 Kafka,復雜路由場景選擇 RabbitMQ。