回覆列表
-
1 # 此生唯一
-
2 # Meta多元宇宙
1,HTML靜態化 ,將活動頁面上的所有可以靜態的元素全部靜態化,並儘量減少動態元素。透過CDN來抗峰值。
5.圖片伺服器分離
6.如果請求的靜態頁面不卡了,但是請求的動態資料還是卡,說明mysql處理的請求太多了,在應用層增加快取7.如果請求激增,還是有大量的查詢到mysql,想辦法處理mysql,所有我們可以把mysql拆開,把mysql做主從複製,負載均衡叢集
我的第一家公司就是電商公司,後面工作基本都是高併發服務開發,下面說下自己對於高併發的拙見。
先來認識下併發的關鍵術語:
併發量:就是說指定時間段內的訪問量,一般用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等元件實現分庫分表!
分散式服務系統通常的瓶頸都在資料庫上,所以資料庫的搭建尤為重要。
同時,在高併發的系統中,還需要注意保持介面的冪等性,資料一致性(通常使用分散式事務,參見我別的回答)!高併發系統瓶頸問題往往在測試過程中很難覆蓋,而在生產過程中爆發,所以是作為系統設計的一個難點通常是面試的必問點,上面涉及到的技術,由於篇幅原因,只是涉及到理論實現,實際更多的技術分享,敬請關注。。。