電商系統架構演進

聊聊電商系統架構演進

具體以電子商務網站為例, 展示web應用的架構演變過程。

1.0時代

alt

這個時候是一個web項目里包含了所有的模塊,一個數據庫里包含了所需要的所有表,這時候網站訪問量增加時,首先遇到瓶頸的是應用服務器連接數,比如tomcat連接數不能無限增加,線程數上限受進程內存大小、CPU內核數等因素影響,當線程數到達一定數時候,線程上下文的切換對性能的損耗會越來越嚴重,響應會變慢,通過增加web應用服務器方式的橫向擴展對架構影響最小,這時候架構會變成下面這樣:

2.0時代

alt

這時候隨著網站訪問量繼續增加,繼續增加應用服務器數量后發現數據庫成了瓶頸,而數據庫的最主要的瓶頸體現在兩方面:

  • 數據庫的最大連接數是有限的,比如當前數據庫的連接數設置8000,如果每個應用服務器與數據庫的初始連接數設置40,那么200臺web服務器是極限, 并且連接數太多后,數據庫的讀寫壓力增大,耗時增加
  • 當單表數量過大時,對該表的操作耗時會增加,索引優化也是緩兵之計

這時,根據業務特點,如果讀寫比差距不大,并且對數據一致性要求不是很高的情況下,數據庫可以采用主從方式進行讀寫分離的方案,并且引入緩存機制來抗讀流量。如果讀寫比差距很大或者對數據一致性要求高時,就不適合用讀寫分離方案,需要考慮業務的垂直拆分,這時期的系統架構圖如下:

3.0時代

3.1 讀寫分離
alt

這時候仍然是垂直架構,所有業務集中在一個項目里。項目維護、快速迭代問題會越來越嚴重,單個模塊的開發都需要發布整個項目,項目穩定性也受到很大挑戰,這是需要考慮業務的垂直拆分,需要將一些大的模塊單獨拆出來,這時候的架構圖如下:

4.0 業務垂直拆分

alt

這時候為了進一步提升用戶體驗,加速用戶的網站訪問速度,會使用CDN來緩存信息,用戶會訪問最近的CDN節點來提升訪問速度。此時的架構圖如下:

4.1 使用CDN來緩存信息
alt

隨著業務量增大,一些核心系統數據庫單表數量達到幾千萬甚至億級,這時候對該表的數據操作效率會大大降低,并且雖然有緩存來抗讀的壓力,但是對于大量的寫操作和一些緩存miss的流量到達一定量時,單庫的負荷也會到達極限,這時候需要將表拆分,一般直接采用分庫分表,因為只做分表的話,單個庫的連接瓶頸仍然無法解決。分庫分表后的架構如下:

4.2分庫分表架構
alt

隨著流量的進一步增大,這時候系統仍然會有瓶頸出現,以訂單系統為例: 單個機房的機器是有限的,不能一直新增下去,并且基于容災的考慮,一般采用同城雙機房的方式,機房之間用專線鏈接,同城跨機房質檢的延時在幾毫秒,此時的架構圖如下:

4.3 同城雙機房
alt

由于數據庫主庫只能是在一個機房,所以仍然會有一半的數據庫訪問是跨機房的,雖然延時只有幾毫秒,但是一個調用鏈里的數據庫訪問太多后,這個延時也會積少成多。其次這個架構還是沒能解決數據庫連接數瓶頸問題

  • 隨著應用服務器的增加,雖然是分庫分表,但每增加一臺應用服務器,都會與每個分庫建立連接,比如數據庫連接池默認連接數是40,而如果mysql數據庫的最大連接數是8000的話,那么200臺應用服務器就是極限。
  • 當應用的量級太大后,單個城市的機器、電、帶寬等資源無法滿足業務的持續增長。這時就需要考慮SET化架構,也就是單元化架構,大體思路就是將一些核心系統拆成多個中心,每個中心成為一個單元,流量會按照一定的規則分配給每個單元,這樣每個單元只負責處理自己的流量就可以了。每個單元要盡量自包含、高內聚。這是從整體層面將流量分而治之的思路。這是單元化后的機構簡圖如下:

5.0 單元化

alt

從上面的架構圖里能看到,流量從接入層按照路由規則(比如以用戶ID來路由)路由到不同單元,每個單元內都是高內聚,包含了核心系統,數據層面的分片邏輯是與接入層路有邏輯一致,也解決了數據庫連接的瓶頸問題,但是一些跨單元的調用是無法避免的,同時也有些無法拆分的業務需要放在中心單元,供所有其他單元調用。

參考文章

  • 文章主要參考自 李智慧的 《大型網站技術架構》
  • https://blog.csdn.net/caoyuanyenang/article/details/86943397
  • https://www.cnblogs.com/lfs2640666960/p/9021205.html
  • http://www.hollischuang.com/archives/728

本文由 mdnice 多平臺發布

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

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

相關文章

深入體驗:山海鯨可視化軟件的獨特魅力

山海鯨可視化軟件是一款功能強大的數據可視化工具,作為該軟件的資深用戶,我深感其獨特的魅力和優勢。下面,我將從軟件特點、操作體驗、數據交互和實際應用場景等方面,為大家詳細介紹山海鯨可視化軟件。 首先,山海鯨可視…

解決Eslint和Prettier關于三元運算符的沖突問題

三元運算符Prettier的格式化 三元運算符Eslint的格式要求 解決辦法 // eslint加入配置,屏蔽標紅報錯indent: [error, 2, { ignoredNodes: [ConditionalExpression] }]效果

Nginx按指定格式記錄訪問日志

今天突然想起來一個日志的一個東西,因為拉項目無意中看到了日志文件的一些東西,現在不經常做后端了,加上其他的一些原因吧.有時候有些問題也沒想太多,馬馬虎虎就過了,后來想想還是要記錄一下這方面的處理過程吧: 一般我們作為開發人員關注的日志只是在應用程序層面的,我們稱它…

LSTM_預測價格問題_keras_代碼實操

0、問題描述 使用Bicton數據集,對close數據進行預測,使用60個數據點預測第61個數據點。 下載數據集:Bitcoin Historical Data 前期已經使用了MLP和RNN進行預測:這里 1、 沒有寫完,明天再寫:)…

POJ 3735 Training little cats 動態規劃(矩陣的冪)

一、題目大意 我們有N只貓&#xff0c;每次循環進行K次操作&#xff08;N<100&#xff0c;K<100&#xff09;&#xff0c;每次操作可有以下三種選擇&#xff1a; 1、g i 給第i只貓1個食物 2、e i 讓第i只貓吃完它所有的食物 3、s i j 交換第i和j只貓的食物。 求出M次…

JS自己定義數組擴展方法 求和 和 最大值、最小值

相信有小伙伴看到這一個標題可能會想&#xff1a;現在都可以自己寫方法了嗎&#xff1f;這么炸裂。沒錯我們是可以自己寫方法的。 1.我們定義的這個方法&#xff0c;任何一個數組實例對象都可以使用 2.自定義的方法寫到 數組.propertype身上 最大值 const arr [1,2,3,4]Array…

銷售技巧培訓之如何提高手機銷售技巧

銷售技巧培訓之如何提高手機銷售技巧 隨著科技的迅速發展&#xff0c;手機已成為我們日常生活中不可或缺的一部分。作為一名手機銷售員&#xff0c;了解手機銷售技巧是必不可少的。本文將通過案例分析與實踐&#xff0c;為你揭示手機銷售的奧秘。 一、了解客戶需求 在銷售過程…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 3 “編譯 NXP i.MX RT1060”( 完 )

此章節敘述如何修改、建構 i.MX RT1060 的 Sample Code“aws_remote_control_wifi_nxp” 1. 點擊“Import SDK example(s)” 2. 選擇“MIMXRT1062xxxxA”>“evkmimxrt1060”&#xff0c;并確認 SDK 版本后&#xff0c;點擊“Next>” 3. 選擇“aws_examples”>“aw…

在 Docker 容器中運行 macOS:接近本機性能,實現高效運行 | 開源日報 No.96

cxli233/FriendsDontLetFriends Stars: 2.6k License: MIT 這個項目是關于數據可視化中好的和不好的實踐&#xff0c;作者通過一系列例子解釋了哪些圖表類型是不合適的&#xff0c;并提供了如何改進或替代它們。主要功能包括展示錯誤做法以及正確做法&#xff0c;并提供相應代…

【數值計算方法(黃明游)】解線性代數方程組的迭代法(一):向量、矩陣范數與譜半徑【理論到程序】

文章目錄 一、向量、矩陣范數與譜半徑1、向量范數a. 定義及性質補充解釋范數差 b. 常見的向量范數 l 1 l_1 l1?、 l 2 l_2 l2?、 l ∞ l_\infty l∞? 范數性質關系 2、矩陣范數a. 矩陣的范數b. 常見的矩陣范數相容范數算子范數 3、譜半徑4、知識點總結1. 向量范數2. 矩陣范數…

Mybatis XML 多表查詢

這篇需結合 <<Mybatis XML 配置文件>>那一篇博客一起看 工作中盡量避免使用多表查詢,尤其是對性能要求非常高的項目 我們之前建了個用戶表(代碼在Mybatis XML配置文件那篇博客里),這次再建一個文章表,代碼如下 : -- 創建?章表 DROP TABLE IF EXISTS articleinf…

vue中組件傳值方法

父組件給子組件傳值 一、 1.在子組件標簽中寫入父組件傳遞數據 向下傳遞prop 2.在子組件內聲明props選項接收父組件傳遞的數據 props:[,,] 父組件&#xff1a; <Header :msgmsg ></Header> 子組件&#xff1a; props:[msg], 二、 provide i…

vue 批量下載文件,不走后端接口的方法

今天ld提了一個需求&#xff0c;說頁面的列表里面有要下載的地址,然后點擊批量下載。我思索片刻&#xff0c;給出了代碼 1.這個是列表頁面的代碼 <!-- 這個是列表頁面的代碼 --> <el-table :data"userListShow" align"center"border highlight-…

AI 訓練框架:Pytorch TensorFLow MXNet Caffe ONNX PaddlePaddle

https://medium.com/jit-team/bridge-tools-for-machine-learning-frameworks-3eb68d6c6558

基于jsonrpc4j實現JSON-RPC over HTTP(服務端集成Spring Boot)

1.JSON-RPC說明 JSON-RPC是一個無狀態且輕量級的遠程過程調用(RPC)協議。 它主要定義了一些數據結構及其相關的處理規則。 它運行時可以基于tcp(socket),http等不同的消息傳輸方式&#xff0c; 即它不關心底層傳輸方式的細節。 它使用JSON&#xff08;RFC 4627&#xff09;作為…

Tabbar切換效果(vant)

route 是否開啟路由模式 <template><div class"layout-page"><!-- 二級路由出口 --><router-view></router-view><van-tabbar route><van-tabbar-item to"/home">首頁<!-- 圖標切換為active是高亮 -->&…

網絡知識點之-組播協議

組播協議&#xff0c;是一種允許將一臺主機發送的數據通過網絡路由器和交換機復制到多個加入此組播的主機&#xff0c;一對多的通訊方式。 簡介 組播協議與廣泛使用的單播協議的不同之處在于&#xff0c;一個主機用單播協議向n個主機發送相同的數據時&#xff0c;發送主機需要…

Git全局設置命令---設置提交人郵箱

介紹 使用git命令設置提交人郵箱。 命令 git config --global user.email "xxxxxxxx.com"

JAVA實現敏感詞高亮或打碼過濾:sensitive-word

練手項目中實現發表文章時檢測文章是否帶有敏感詞&#xff0c;以及對所有敏感詞的一鍵過濾功能 文章目錄 效果預覽實現步驟 效果預覽 隨便復制一篇內容到輸入框 機器審核文章存在敏感詞&#xff0c;彈消息提示并進入人工審核階段&#xff08;若機器審核通過&#xff0c;則無需審…

eclipse的日志文件放在什么位置

eclipse的日志文件放在<workspace的目錄>/.metadata目錄下面&#xff0c;例如&#xff1a;