回覆列表
  • 1 # 此生唯一

    我的第一家公司就是電商公司,後面工作基本都是高併發服務開發,下面說下自己對於高併發的拙見。

    先來認識下併發的關鍵術語:

    併發量:就是說指定時間段內的訪問量,一般用TPS(每秒事務數),QPS(每秒查詢數),響應時間等指標進行表示!

    何為高併發?短時間內有大量的請求訪問伺服器,即TPS或者QPS很高!

    高併發對伺服器有著極高的要求,而這些要求主要集中在應用伺服器和資料庫伺服器上,所以一般高併發的解決通常是提高應用伺服器和資料庫的處理能力!

    針對應用伺服器:

    限流:比如說以前玩dota的時候,遇到遊戲平臺限流,登入了也玩不了!一般限流透過某種演算法(計數器,漏桶等)選擇性的讓一部分請求到達後臺,進行處理!

    消峰:通常在電商的秒殺系統,活動等場景下,通常會在短時間內出現大量的流量,從正態分佈圖來看就是一個尖峰,如何讓訪問變得平緩呢?通常將請求放請求佇列,讓應用服務主動拉取,進行請求執行!

    提高應用伺服器能力:

    ①,連線能力:拋棄傳統的多執行緒(多程序)處理連線的方式,使用基於netty的IO多路複用的架構搭建伺服器,提高連線能力,可使用nginx搭建應用服務叢集實現負載均衡的同時,保證更多連線。

    ②,非同步處理:避免同步處理引起的阻塞,使用非同步呼叫能提升CPU使用率,避免資源浪費。

    ④,叢集或者微服務:使用nginx加幾臺應用伺服器組成叢集,或者業務解耦搭建微服務架構,避免單點宕機的危害!

    ⑤,快取:使用redis,memcache等分散式快取,儲存臨時資料,定義表資料,配置等任何可以快取的東西,藉助記憶體型快取的快速特性得到更快的處理能力。

    ⑥,服務間通訊:

    介面呼叫:比如springcloud加eureka實現的服務,在eureka服務端實現服務列表的維護,介面的註冊和暴露,然後各個服務根據獲取的服務列表進行服務呼叫,可以使用feign實現客戶端的負載均衡,保證服務均衡呼叫。

    訊息中介軟體:使用kafka,ons,redis等訊息中介軟體實現服務之間的訊息傳遞,實現非同步處理的同時,保證資料不丟失!

    ⑦,程式碼最佳化:避免迴圈建立物件,執行緒等,減少使用加鎖操作,避免死鎖等可能出現的bug,減少對資料庫的頻繁訪問。

    針對資料庫:

    1,提升單個數據庫服務的能力,最佳化資料庫伺服器效能,連線池最佳化,經常檢視資料庫狀態(show status;)

    2,叢集:搭建主從複製,讀寫分離,雙主互備,分庫分表根據業務量選擇不同的叢集方式,提供更加優異的效能。

    3,利用資料庫中介軟體:使用canal實現資料同步到專門的查詢庫,或者快取,使用mycat等元件實現分庫分表!

    分散式服務系統通常的瓶頸都在資料庫上,所以資料庫的搭建尤為重要。

    同時,在高併發的系統中,還需要注意保持介面的冪等性,資料一致性(通常使用分散式事務,參見我別的回答)!高併發系統瓶頸問題往往在測試過程中很難覆蓋,而在生產過程中爆發,所以是作為系統設計的一個難點通常是面試的必問點,上面涉及到的技術,由於篇幅原因,只是涉及到理論實現,實際更多的技術分享,敬請關注。。。

  • 2 # Meta多元宇宙

    1,HTML靜態化 ,將活動頁面上的所有可以靜態的元素全部靜態化,並儘量減少動態元素。透過CDN來抗峰值。

    5.圖片伺服器分離

    6.如果請求的靜態頁面不卡了,但是請求的動態資料還是卡,說明mysql處理的請求太多了,在應用層增加快取7.如果請求激增,還是有大量的查詢到mysql,想辦法處理mysql,所有我們可以把mysql拆開,把mysql做主從複製,負載均衡叢集

  • 中秋節和大豐收的關聯?
  • 果樹不能大水漫灌嗎?為什麼?