如何打造一個高并發系統?

今天和大家聊聊作為一個后端開發,在實際工作中,我們如何打造一個高并發的系統?
如下圖所示,大概有六個層面,我們結合具體的場景直播間簽到去一一細說。

在這里插入圖片描述

一、前端

1、打散請求即把用戶的接口分散一點去請求后端,盡量不要集中在某一時刻
場景:比如直播間講師發起了一個簽到,用戶去點擊簽到,調用簽到請求接口。假設這個直播間的在線人數上百萬,那么這個簽到接口的請求可能會有近百萬的QPS。毫無疑問,這會對后端服務造成瞬時、巨大的流量沖擊。
解決措施:這種瞬時洪峰流量,我們就可以在前端對用戶簽到接口做打散處理。比如針對直播間的在線人數,當超過某個閾值時,做3秒內任一毫秒的分散請求。避免這些請求在大流量直播的直播間里,瞬間同時請求過來,沖垮后端服務。

2、防抖防重即在前端加上防止重復點擊、重復請求后端的邏輯。比如點擊簽到按鈕后,前端做一些類似3秒的防重復請求處理,避免用戶多次點擊請求到后端,這樣可以減少大量無意義無效的請求。

3、服務降級:在高并發、系統壓力較大或部分服務出現故障時,通過暫時減少或關閉某些功能,以保證系統的核心功能仍然能夠正常運行,避免整個系統崩潰。
場景:比如在簽到服務中,用戶簽到是核心接口,當簽到服務受到流量沖擊導致壓力過大時,可以將除該接口外的其它功能在前端暫時屏蔽掉(可配置),這樣用戶就不會去請求對應的接口了,優先保證核心接口正常運行。

二、Nginx/網關

1、負載均衡:這個應該大家都比較熟悉,就是盡可能將請求均勻地打在各個服務器上,常見的有輪詢策略、hash策略等,就不一一贅述了。

2、網關限流:一般我們C端的服務都會有一個統一的網關系統,實現比如用戶信息獲取、路由的分發、接口限流等功能。我們對于C端的接口,在上線前會經過接口壓測,然后根據壓測結果設置接口限流值。在高并發場景下,比如簽到接口設置的是10WQPS,我們就會把在同一秒內超過10W的請求直接在網關層丟棄掉,避免將下游的簽到服務打掛

三、業務層

1、同步返回:比如前端請求簽到接口,我們后端會返回簽到成功給前端,但實際是否成功還不確定,因為我們肯定不會實時同步去查詢或者寫入MySQL。畢竟我們的MySQL還是比較脆弱的,經不住上萬QPS同時操作

2、異步處理:跟上面其實意思差不多,同步返回結果,但我們會將實際的數據使用中間件如kafka、RocketMQ、RabbitMQ、Redis等進行削峰,然后推送到下游,最后使用腳本去消費推送的數據進行實際的邏輯處理。

四、數據層

1、本地緩存:感興趣的可以翻翻 我之前寫的文章 。可以說本地緩存是服務器上讀寫性能都最高的介質了,因為本地緩存是直接操作該服務器本身的內存呀。只要內存夠大,幾十萬、幾百萬的QPS都輕輕松松不在話下

2、Redis緩存:Redis緩存的性能僅此于本地緩存,一般抗10萬以下的QPS用Redis就夠了。Redis緩存實際上也是操作的Redis服務器的內存,只是Redis服務器和本地服務器還有網絡連接。所以Redis性能會比本地緩存稍微差一點,一般同等配置可能都會差一到兩個量級。

3、MySQL:這個大家應該都很熟系了,常用的分庫分表、讀寫分離等等這時都排上用場了。

五、底層架構

1、K8s彈性伸縮在高峰期提前擴容、高峰期之后縮容。在流量突刺時快速擴容,在流量下落時縮容。k8s提供了多種靈活的彈性伸縮機制,可以根據不同場景和需求自動調整集群的資源使用,確保系統能夠在負載波動時穩定運行。根據實際的應用場景,合理配置這些伸縮機制,能夠有效提升系統的彈性和可用性。最重要的是,比之前使用CVM物理機,能極大地降低服務器成本

2、微服務架構:微服務架構通過將單一應用拆分成多個獨立的服務,使得每個服務可以獨立擴展和維護,從而提高系統的可擴展性和維護性。例如直播間紅包是一個服務、直播間簽到是一個服務、直播間抽獎又是另一個服務…。這些服務通常是在單獨的服務去維護,盡量做到互相隔離,互不影響

六、日志監控和告警

假如現網服務出現了問題,我們如何快速地感知呢?那當然是在各個關鍵服務都增加日志記錄,然后增加監控告警,觸發某個閾值時就告警。盡量在用戶感知到問題前,我們去發現到并解決。

以上,就是我們在設計高并發系統時,需要考慮的一些問題和一些解決方案。當然,這里只是講了大的宏觀架構層面,落地到具體的業務場景中,還需要結合實際情況去思考一些細節和方案,去解決實際的性能瓶頸點,這是一件非常有意思的事,希望大家都能從解決問題中收獲快樂

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66829.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

996引擎 - 前期準備-配置開發環境

996引擎 - 前期準備 官網搭建服務端、客戶端單機搭建 開發環境配置后端開發環境配置環境 前端開發環境配置環境 后端簡介前端簡介GUILayoutGUIExport 官網 996傳奇引擎官網 所有資料從官網首頁開始,多探索。 文檔: 996M2-服務端Lua 996M2-客戶端Lua 搭…

迅為RK3568開發板篇OpenHarmony實操HDF驅動控制LED-添加內核編譯

編譯內核時將該 HDF 驅動編譯到鏡像中,接下來編寫驅動編譯腳本 Makefile,代碼如下所示: 加入編譯體系,填加模塊目錄到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多內容可以關注:迅為RK3568開發板篇OpenHa…

生信軟件管家——conda vs pip

pip vs conda: 安裝過python包的人自然兩種管理軟件都用過, Pip install和Conda install在Python環境中用于安裝第三方庫和軟件包,但它們在多個方面存在顯著的區別 總的來說: pip是包管理軟件,conda既是包管理軟件&…

電子電氣工程會議

征稿主題 集中但不限于“電子電氣與信息工程”等其他相關主題。 電子、電氣工程: 電路與電子學、智能芯片、半導體器件、數字信號處理、遙感,雷達和傳感、射頻技術、微電子技術與電子信息、電子工程中的計算智能、電力領域的數據科學技術、智能電力設…

OpenVela 架構剖析:從內核到應用

目錄 一、總體架構概述 二、 內核層 2.1. OpenVela架構的內核基礎 2.2. 內核層的主要職責 2.3. OpenVela對NuttX的擴展與優化 三、系統服務層 2.1. 進程管理 2.2. 內存管理 2.3. 文件系統 2.4. 網絡通信 四、框架層 4.1. 模塊化設計 4.2. API接口 4.3. 組件和服務…

ubuntu 布暑python項目

在Ubuntu上部署Python項目通常包括以下幾個步驟: 1 安裝必要的軟件: 確保系統已經安裝了Python、pip(Python包管理工具)以及virtualenv(可選,用于創建獨立的Python環境)。如果還沒有安裝&#…

RV1126畫面質量一:視頻基礎

在聊視頻畫面調節之前,先來認識一下視頻畫面的有一些基礎問題 如今我們所處的時代,是移動互聯網時代,也可以說是 視頻時代 。 從快播到抖音,從“ 三生三世 ” 到 “ 三十而已 ” ,我們的生活,被越來越多的 …

準備知識——波紋度和粗糙度區別與聯系

在開始齒輪齒面波紋度開始前,先來學習一下基本概念——波紋度和粗糙度,廢話不多說,直接開始: 什么是表面粗糙度? 表面粗糙度定義為實際表面相對于波谷的較短頻率。如果去觀察加工零件,會注意到它們的表面…

五、華為 RSTP

RSTP(Rapid Spanning Tree Protocol,快速生成樹協議)是 STP 的優化版本,能實現網絡拓撲的快速收斂。 一、RSTP 原理 快速收斂機制:RSTP 通過引入邊緣端口、P/A(Proposal/Agreement)機制等&…

寶塔Linux+docker部署nginx出現403 Forbidden

本文主要講述了寶塔docker部署nginx出現403 Forbidden的原因,以及成功部署前端的方法步驟。 目錄 1、問題描述2、問題檢測2.1 檢測監聽端口是否異常2.2 檢測Docker容器是否異常2.2.1 打開寶塔Linux的軟件商店,找到Docker管理器,查看前端容器是…

光交箱啞資源巡檢過程中都要檢查哪些設備,怎樣實現智能化管理

一、光交箱啞資源管理現狀 光交箱啞資源主要包括光纖、光纜、接頭盒、配線架等設備。這些設備在通信網絡中起著至關重要的作用,但由于缺乏智能化的監控和診斷能力,管理難度較大。 效率低下:人工巡檢的頻率和覆蓋范圍有限,資源清…

代碼隨想錄——串

文章目錄 反轉字符串反轉字符串Ⅱ路徑加密反轉字符串中的單詞動態口令字符串匹配重復的子字符串 反轉字符串 344. 反轉字符串 //前后對應交換 //0<->sSize-1 //1<->sSize-2 //... //i<->sSize-1-i,i0,1,...,(sSize-1)/2 void reverseString(char* s, int s…

在K8S中使用Values文件定制不同環境下的應用配置詳解

在Kubernetes&#xff08;簡稱K8s&#xff09;環境中&#xff0c;應用程序的配置管理是一項關鍵任務。為了確保應用程序在不同環境&#xff08;如開發、測試、預發布和生產&#xff09;中都能穩定運行&#xff0c;我們需要為每個環境定制相應的配置。Values文件是在使用Helm管理…

機器學習(5):支持向量機

1 介紹 支持向量機&#xff08;Support Vector Machine&#xff0c;簡稱 SVM&#xff09;是一種監督學習算法&#xff0c;主要用于分類和回歸問題。SVM 的核心思想是找到一個最優的超平面&#xff0c;將不同類別的數據分開。這個超平面不僅要能夠正確分類數據&#xff0c;還要使…

【前端知識】簡單易懂的vue前端頁面元素權限控制

文章目錄 設計思路代碼實現1. **權限數據管理**2. **權限判斷方法**3. **動態控制元素**4. **路由權限控制**5. **無權限頁面** 總結相關文獻 在前端實現基于 Vue 的權限控制&#xff0c;通常需要結合后端返回的用戶權限數據&#xff0c;動態控制頁面元素的顯示與隱藏、按鈕的可…

250123-java設計模式

設計模式是指經過大量實踐后經過總結和理論化后優選的代碼結構。 1.1 單態設計模式 一個類只能創建一個實例化對象。 1.2 模版設計模式 比如抽象類的應用。 1.3 代理設計模式 比如接口的應用。 1.4 共享設計模式 why&#xff1f;有效的減少垃圾空間的產生。 1.5 集成設…

C#性能優化技巧:利用Lazy<T>實現集合元素的延遲加載

一、C#中的Lazy C#中的Lazy<T>是一個泛型類&#xff0c;它實現了延遲加載&#xff08;Lazy Initialization&#xff09;的功能。延遲加載是指對象的創建被推遲&#xff0c;直到第一次被使用時才進行實例化。這對于大型或資源密集型對象的性能優化非常有用&#xff0c;因…

百度APP iOS端磁盤優化實踐(上)

01 概覽 在APP的開發中&#xff0c;磁盤管理已成為不可忽視的部分。隨著功能的復雜化和數據量的快速增長&#xff0c;如何高效管理磁盤空間直接關系到用戶體驗和APP性能。本文將結合磁盤管理的實踐經驗&#xff0c;詳細介紹iOS沙盒環境下的文件存儲規范&#xff0c;探討業務緩…

docker安裝elk6.7.1-搜集java日志

docker安裝elk6.7.1-搜集java日志 如果對運維課程感興趣&#xff0c;可以在b站上、A站或csdn上搜索我的賬號&#xff1a; 運維實戰課程&#xff0c;可以關注我&#xff0c;學習更多免費的運維實戰技術視頻 0.規劃 192.168.171.130 tomcat日志filebeat 192.168.171.131 …

SpringBoot的Swagger配置

一、Swagger配置 1.添加依賴 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version> </dependency> 2.修改WebMvcConfig Slf4j Configurat…