電商系統架構演進

来源:https://www.cnblogs.com/88223100/archive/2023/10/14/Evolution-of-E-commerce-System-Architecture.html
-Advertisement-
Play Games

具體以電子商務網站為例, 展示web應用的架構演變過程。 1.0時代 這個時候是一個web項目里包含了所有的模塊,一個資料庫里包含了所需要的所有表,這時候網站訪問量增加時,首先遇到瓶頸的是應用伺服器連接數,比如tomcat連接數不能無限增加,線程數上限受進程記憶體大小、CPU內核數等因素影響,當線程數 ...


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

1.0時代

圖片

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

2.0時代

圖片

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

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

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

3.0時代

3.1 讀寫分離

圖片

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

4.0 業務垂直拆分

圖片

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

4.1 使用CDN來緩存信息

圖片

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

4.2分庫分表架構

圖片

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

4.3 同城雙機房

圖片

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

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

5.0 單元化

圖片

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

參考文章

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

 

作者|頂尖架構師棧

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Evolution-of-E-commerce-System-Architecture.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文地址:Window10安裝linux子系統及子系統安裝1Panel面板 - Stars-One的雜貨小窩 最近看到halo博客發佈了2.10.0,終於是新增了個備份功能,於是有了念頭想要升級下 但是目前我還是使用halo1.5版本,所以跨版本遷移可能會有問題,官方提議還是先用個測試環境進行測試驗 ...
  • XN297LBW 是一個SOP8封裝的2.4GHz頻段無線收發晶元, 價格在1元左右, 因為面向的主要是低成本應用, 大多數搭配的MCU為廉價的8位8051, 不一定有硬體SPI, 為了保證相容在SDK中使用的都是GPIO模擬SPI方式進行驅動. 但是實際上是可以通過硬體SPI方式進行驅動的. 本文... ...
  • windows操作系統為我們提供了一套底層Socket API,用於實現網路通信。在我們編寫的程式中,如果需要引用該網路庫,需要實現以下幾步: 1、包含頭文件 1 #include <WinSock2.h> 其中,頭文件<WinSock2.h>表示Windows Socket 第二版,第一版為 <w ...
  • 本文總結了MongoDB的快速入門、Linux安裝和Docker配置指南。它提供了一步步的操作指引,幫助讀者迅速上手MongoDB,並瞭解如何在Linux環境下進行安裝、啟動和配置。此外,文章還介紹了使用Docker安裝和配置MongoDB的方法,使讀者能夠更輕鬆地部署和管理MongoDB實例。 ...
  • Ⅰ 資料庫 ①層次型資料庫 ②網狀型資料庫 ③關係型資料庫(主要介紹) E-R圖:屬性(橢圓形),實體(矩形),聯繫(菱形-一對一、一對多、多對多)註:有的聯繫也有屬性 關係型資料庫的設計範式: 第一範式(1NF):屬性不可再分,欄位保證原子性 第二範式(2NF):在滿足1NF的基礎上,要求表中的每 ...
  • 本文以瀏覽器的進程和線程為切入點,以開源的Chromium為例,記錄了前端中的事件迴圈。同時記錄了一些面試題。關鍵詞:隊列,非同步。 ...
  • matomo是一款Google-analytics數據埋點採集上報的平替方案,可保護您的數據和客戶的隱私;正如它官網的slogan: Google Analytics alternative that protects your data and your customers' privacy; 該 ...
  • v-model 是 Vue.js 框架中的一個重要指令,用於實現雙向數據綁定。它是一個語法糖,等效於使用 :value 和 @input 事件的組合。v-model 的工作原理可以分為以下步驟:首先,Vue 創建一個代理對象,其中包含了數據屬性,例如 message。初始時,表單元素的值會被設置為數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...