小米一面:電商系統開發遇到了哪些問題?

昨晚在直播間帶着大家刷第 22 套小米麪試真題時,遇到了這樣一個問題,面試官問:“你在開發電商系統的過程中,都遇到了哪些問題?”,個人覺得這個問題既屬於開放性問題,同時又比較具有代表性,所以就單拿出來和大家分享交流一下經驗。

首先,我們先分析一下,電商系統開發中可能會遇到的經典的問題有哪些?我這總結了幾個,大家也可以在評論區補充交流:

  1. 瞬時流量,高併發問題
  2. 庫存問題:超賣和少賣問題。
  3. 弱網環境下支付問題
  4. 黃牛刷單問題
  5. 重複訂單去重問題

這是我們在電商系統開發中,可能會遇到的一些經典問題,那怎麼來解決這些問題呢?

1.解決高併發問題

高併發系統有以下三個經典的解決方案:

  1. 緩存:一種重要的計算機技術,它通過減少數據訪問時間和提高數據訪問速度來優化系統查詢的效率。
  2. 限流:一種計算機網絡流量控制技術,主要用於控制數據的傳輸速率,防止網絡擁堵和超出系統的處理能力。通過限流可以控制單位時間內請求的數量,或者限制一個時間窗口內的請求數量,以保護系統的穩定性和可用性。
  3. 熔斷:一種在分佈式系統中用於處理故障和防止系統過載的保護機制。它的主要思想源於電路中的熔斷器,當電流過大時,熔斷器會自動熔斷以保護電路。在分佈式系統中,熔斷器的概念被引申爲保護系統免受過多錯誤或請求的衝擊。

具體的落地實現:

  1. 緩存具體實現:使用 Redis 實現分佈式緩存,另外配合 Nginx 緩存 + 本地 Caffeine 緩存 + CDN 緩存 + 瀏覽器緩存共同實現多級緩存來保證系統的性能。
  2. 限流具體實現:限流可以使用 Spring Cloud Alibaba 組件 Sentinel 來實現,在項目中引入 Sentinel 框架,配置資源和資源限流規則即可實現限流功能。
  3. 熔斷具體實現:熔斷的實現和限流類似,也可以使用 Spring Cloud Alibaba 組件 Sentinel 來實現,在項目中引入 Sentinel 框架,配置資源和資源熔斷規則即可實現限流功能。

2.解決庫存問題

庫存的問題有兩個:

  1. 超賣問題
  2. 少賣問題

2.1 解決超賣問題

超賣問題的解決方案有以下幾個:

  1. 限流
  2. 分佈式鎖
  3. Redis Lua(先判斷庫存 -> 減庫存 + 加訂單)
  4. 使用數據庫 update 操作庫存

PS:生產環境通常使用限流 + Redis Lua 腳本來解決超賣問題。

2.2 解決少賣問題

少賣問題我們通常使用及時對賬系統 + 人工補償機制來解決。

3.解決弱網支付問題

弱網環境下支付的問題主要涉及到在網絡信號較差的情況下進行支付操作時可能出現的一系列問題。

弱網環境最主要的是要解決支付狀態同步的問題,它的解決方案有以下幾個:

  1. 支付平臺提供回調方法進行支付狀態的刷新。
  2. 手動觸發主動出查詢得到支付狀態。
  3. 定時任務進行刷新。

4.解決刷單問題

防止黃牛刷單的常見解決方案有以下兩種:

  1. 添加圖形驗證碼:此手段可以解決大部分刷單問題。
  2. 添加異常觀測平臺和 IP 黑名單限制:通過異常報警平臺觀察到異常 IP,然後將異常 IP,加入到 IP 黑名單,從而解決刷單問題。

5.解決重複訂單問題

重複訂單去重問題的解決方案有以下兩個:

  1. 通過冪等性判斷去除重複訂單:可以通過自定義註解 + Redis 來實現冪等性過濾。
  2. 數據庫唯一約束保底:數據庫通過設置唯一約束來保證不會有重複的訂單添加到數據庫,從而避免了重複訂單的產生。

課後思考

除了以上問題之後,你在開發電商系統中還遇到了哪些經典的問題?冪等性判斷的核心實現代碼是啥?自定義註解的實現方式有幾種?

本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、併發、併發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章