《大型網站技術架構 核心原理與案例分析》讀書筆記

来源:https://www.cnblogs.com/wangzhongqiu/archive/2018/04/28/8964771.html
-Advertisement-
Play Games

一、大型網站架構演化 1、大型網站特點 高併發,大流量 高可用 海量數據 用戶分佈廣泛,網路情況複雜 安全環境惡劣 需求快速變更,發佈頻繁 漸進式發展 2、大型網站架構發展歷程 文件伺服器,資料庫伺服器,應用伺服器分離 應用伺服器增加本地緩存,本地緩存優先,增加分散式緩存伺服器 使用應用程式伺服器集 ...


一、大型網站架構演化

1、大型網站特點

  • 高併發,大流量
  • 高可用
  • 海量數據
  • 用戶分佈廣泛,網路情況複雜
  • 安全環境惡劣
  • 需求快速變更,發佈頻繁
  • 漸進式發展

2、大型網站架構發展歷程

  • 文件伺服器,資料庫伺服器,應用伺服器分離
  • 應用伺服器增加本地緩存,本地緩存優先,增加分散式緩存伺服器
  • 使用應用程式伺服器集群提高網站的併發,由負載均衡伺服器統一調度分發
  • 使用分散式文件系統和分散式資料庫系統
  • 使用CDN網路加速和反向代理伺服器:基本原理都是緩存,CDN部署在網路提供商的機房,是用戶在請求網路服務時,可以從距離自己最近的網路提供商機房獲取數據。而反向代理是部署在中心機房,當用戶的請求到達中心機房後,首先訪問的是反向代理伺服器,如果反向代理伺服器中緩存這用戶請求的資源,就將其直接返回給用戶,目的都是儘早返回數據給用戶,加快用戶訪問速度,減輕後端伺服器的壓力。
  • 使用Nosql和搜索伺服器
  • 業務拆分,根據不同的產品,不同的業務,將一個網站拆分成不同的應用,每個應用獨立部署維護,各個應用之間通過消息中間件或者訪問同一個數據存儲系統來構成一個相互關聯的完整系統
  • 分散式服務,將公用的業務提取出來,獨立部署,為其他應用伺服器提供可復用的共用業務服務(可以通過dubbo和zookeeper集群實現)

3、網站架構的價值觀和設計誤區

  • 架構的選取隨網站所需靈活應對
  • 主要驅動力量是網站的業務發展
  • 不可一味追隨大公司的架構設計,照搬照抄
  • 網站技術是為了業務存在的,不可為了技術而技術
  • 不要企圖使用技術解決一切問題。技術是用來解決業務問題的,同樣業務問題也可以採用業務手段,通過修改業務架構來解決

二、大型網站架構模式

1、分層

將系統在橫向緯度上分成幾個部分,每個部分負責單一職責,通過上層對下層的依賴和調用組成一個完整的系統。網路的7層通訊協議,電腦硬體、操作系統、應用軟體,都採用了分層的思想。將網站系統分為應用層、服務層、數據層,三層結構分別部署在不同的伺服器上

  • 應用層:負責具體業務和視圖展示
  • 服務層:為應用層提供服務支持,如用戶管理服務、購物車服務
  • 數據層:提供數據存儲訪問服務,如資料庫、緩存、文件、搜索引擎等

2、分割

在縱向方面對系統進行劃分,比如應用層,可以將不同業務分割,將購物、論壇、搜索、廣告分割成不同的應用,由獨立的團隊負責。部署在不同的伺服器上。

3、分散式

分層和分割的目的就是為了切分後的模塊便於分散式部署,將不同的模塊部署在不同的伺服器上。同時,分散式也帶來了很多問題,

  • 不同伺服器之間的通信對網路依賴很大
  • 保持數據一致性比較困難
  • 網站依賴錯綜複雜,開發維護困難

    常見的分散式方案有以下幾種

  • 分散式應用和服務。
  • 分散式靜態資源
  • 分散式數據和存儲
  • 分散式計算
  • 分散式文件系統
  • 分散式鎖
  • 分散式配置。支持網站線上服務配置實時更新

4、集群

雖然分散式已經將各個應用分開部署,但是對於用戶集中訪問的模塊,還需要獨立部署伺服器集群化,即多台伺服器部署相同應用構成一個集群,通過負載均衡設備共同對外提供服務。並且支持線性擴展,發生故障時的失效轉移。即使是訪問量很小的分散式應用和服務也至少要部署兩台構成小的集群,提高系統的可用性

5、緩存

緩存是改善軟體性能的第一手段。大型網站很多方面都使用了緩存設計:

  • CDN,即內容分髮網絡。在這裡緩存網站的一下靜態資源(較少變化的數據),可以就近以最快速度返回給用戶。如視頻網站和門戶網站會將用戶訪問量大的熱點內容緩存在CDN
  • 反向代理。當用戶的請求到達數據中心時,最先訪問到的是反向代理伺服器,這裡緩存網站的靜態資源,無需繼續將請求轉發給應用伺服器,直接返回給用戶
  • 本地緩存。在應用伺服器本地緩存這熱點數據,應用程式可以在本地記憶體中直接訪問,無需訪問數據層
  • 分散式緩存。將數據存儲在專門的分散式緩存集群中,應用伺服器通過網路通訊訪問緩存數據。

      緩存同時也存在著緩存擊穿、緩存雪崩、緩存熱點不集中的問題

6、非同步

在單一伺服器內部可通過多線程共用記憶體隊列的方式實現非同步,在分散式系統中,多個伺服器集群通過分散式消息隊列實現非同步。非同步架構是典型的生產者-消費者模式。使用非同步消息隊列能夠帶來如下好處:

  • 提高系統可用性
  • 提高系統響應速度
  • 消除併發訪問高峰。消息隊列能夠把突然增加的訪問請求數據放入到隊列中,等待消費者處理,不會對網站造成太大壓力

7、冗餘

為了提高系統的可用性,防止某些伺服器宕機的情況下系統依然可以繼續服務,需要一定的伺服器冗餘運行、數據冗餘備份。資料庫除了定期備份實現冷備份之外,還需要主從分離,實時同步實現熱備份。為了抵禦海嘯、地震等不可抗力,還需要在全球範圍內部署災備數據中心。

8、自動化

發佈過程自動化:自動化代碼管理,自動化測試,自動化安全測試,自動化部署。系統運行過程中還有:自動化監控、自動化報警、自動化失效轉移、自動化失效恢復、自動化降級、自動化資源分配。

9、架構模式在新浪微博的應用

新浪微博系統分為三層:

  • 最下層是基礎服務層,提供資料庫、緩存、搜索、存儲等基礎服務
  • 中間層是平臺服務和應用服務層,微博的核心是微博、用戶、關係,這些服務被分割成獨立的模塊,通過依賴調用和對共用基礎服務構成微博的業務基礎
  • API層,是微博的業務層,包括網站、app、第三方應用,通過調用API集成到微博系統中,共同組成一個生態系統

微博的發佈,早起使用同步推模式,用戶發表微博後會立即將這條微博插入到資料庫所有粉絲的訂閱列表中,用戶量比較大時,會引起大量的資料庫寫操作,超出負載,導致系統性能下降。後來改用非同步推拉方式,用戶發表微博之後立刻寫到消息隊列中然後立刻返回,消息隊列消費者將微博推送給當前線上粉絲的訂閱列表中,非線上用戶等登錄後在根據關註列表拉取微博訂閱列表

由於微博頻繁刷新,微博使用多級緩存策略,熱門微博和明星微博緩存在所有的微博伺服器上,線上用戶的微博和近期微博緩存在分散式緩存集群中

三、大型網站核心結構要素

1、性能。系統吞吐量幾個重要參數:QPS(TPS)、併發數、響應時間

        QPS(TPS):每秒鐘request/事務 數量

        併發數: 系統同時處理的request/事務數

        響應時間:  一般取平均響應時間

        QPS(TPS)= 併發數/平均響應時間

2、高可用

指的是網站可以保證大部分時間系統都是可用的,一些知名大型網站可以得到99.99%的時間都是可用的。高可用的設計目標是當有部分伺服器宕機時,整體的服務或者應用依然可用。

  • 保證網站高可用的主要手段就是冗餘,應用部署在多台伺服器上同時提供訪問,數據存儲在多個伺服器上互相備份,任何一臺伺服器宕機都不會影響應用的整體可用。
  • 網站的高可用還需要軟體開發過程的質量保證,通過預發佈驗證、自動化測試、自動化發佈、灰度發佈等手段,減少將故障引入線上環境的可能。

3、伸縮性

衡量的主要指標就是是否可以用多台服務構架集群,是否容易向集群中添加新的伺服器,加入的新的伺服器是否可以提供和原來伺服器無差別的服務,集群可容納的總伺服器數量是否有限制。

  • 應用伺服器,通過使用合適的負載均衡設備,就可以向集群中不斷加入伺服器
  • 緩存伺服器集群,加入新的伺服器可能會導致緩存路由失效,如果對緩存的依賴嚴重,可能會導致系統崩潰。
  • 關係資料庫。雖然支持主從複製,主從熱備,但是很難做到大規模集群的可伸縮性。因此關係型資料庫的可伸縮性方案必須在資料庫之外實現,通過路由分區等手段,將多個部署的資料庫伺服器集成一個集群。
  • NoSql資料庫。由於其先天就是為了海量數據而生的,因此對可伸縮性的支持非常好。

4、擴展性

衡量的主要標準就是網站增加新的業務產品時,是否會對現有產品產生影響,不需要改動或很少改動既有業務就可以上線新產品,不同產品之間很少的耦合,一個產品改動對其他產品沒有影響。

網站的可擴展架構的主要手段是事件驅動架構和分散式服務

  • 事件驅動,通常利用消息隊列實現,把消息的生產者和消費者分開,這樣可以透明的增加新的生產者和消費者
  • 分散式服務則是將業務和可復用服務拆分開,通過分散式服務調用可復用服務。可復用服務升級變更的時候,也可以通過提供多版本服務實現透明升級,不需要強制應用同步變更。

5、安全性

網站的安全架構需要保證網站不受惡意訪問和攻擊、保護網站的重要數據不被竊取。

 四、網站的高性能架構

1、網站性能測試

性能測試指標。主要指標有響應時間、併發數、吞吐量、性能計數器

        

2、Web前端性能優化

瀏覽器訪問優化

  • 減少http請求。合併css、JavaScript、圖片,將瀏覽器一次訪問需要的資源合併成一個文件
  • 使用瀏覽器緩存。通過設置http頭部中的Cache-Control和Expires屬性,設置瀏覽器緩存。將css、javascript、圖片等靜態資源通過瀏覽器緩存起來,如果需要靜態資源及時應用到客戶端瀏覽器,可通過改變文件名實現。

 十四、架構師領導藝術

1、關註人而不是產品

一定要堅信:一群優秀的人做一件他們熱愛的事,一定能取得成功。

領導的真諦:尋找一個值得共同奮鬥的目標,營造一個讓大家都能最大限度發揮自我價值的工作氛圍。

沒有懶惰的員工,只有沒被激發出來的激情。所有強迫員工加班的管理者都應該為自己的無能感到羞愧。

2、發掘人的優秀

是事情成就了人,而不是人成就了事。

發掘人的優秀比發掘優秀的人更有意義。

3、共用美好藍圖

架構師要和項目組全體成員共同描繪一個藍圖,這個藍圖是真個團隊能夠認同的,是團隊共同奮鬥的目標。這個藍圖應該是表述清楚的、形象的、簡單的。

4、共同參與架構

不要只有架構師一人擁有架構,讓其他人參與架構的設計和維護

5、學會妥協

不要企圖在項目中證明自己是正確的,一定要記住,你是來做軟體的,不是來做老大的。架構師越早被項目組遺忘,越表示架構非常成功;項目組越離不開架構師,越表示架構還有很多缺陷。

6、成就他人

想要成就自己,先要成就他人

十五、網站架構師職場攻略

1、發現問題,尋找突破

所謂問題,就是體驗不能滿足期望,就會覺得出了問題。消除問題有兩個方法:降低期望、改善體驗

2、提出問題,尋求支持

  • 把“我的問題”變成“我們的問題”
  • 給上司提封閉式問題,給下屬提開放式問題
  • 指出問題,而不是批評人
  • 用贊同的方式提出問題

3、解決問題,達成績效

 


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

-Advertisement-
Play Games
更多相關文章
  • 接著之前的文章:php根據命令行參數生成配置文件 ghostinit.php ...
  • 包是一種通過使用‘.模塊名’來組織python模塊名稱空間的方式。 1. 無論是import形式還是from...import形式, 凡是在導入語句中(而不是在使用時)遇到帶點的,都要第一時間提高警覺:這是關於包才有的導入語法。 2. 包是目錄級的(文件夾級),文件夾是用來組成py文件(包的本質就是... ...
  • 以下代碼可以去掉註釋單獨運行: ...
  • 題目背景 動態樹 題目描述 給定n個點以及每個點的權值,要你處理接下來的m個操作。操作有4種。操作從0到3編號。點從1到n編號。 0:後接兩個整數(x,y),代表詢問從x到y的路徑上的點的權值的xor和。保證x到y是聯通的。 1:後接兩個整數(x,y),代表連接x到y,若x到y已經聯通則無需連接。 ...
  • 【聲明】歡迎轉載,但請保留文章原始出處→_→ 秦學苦練:http://www.cnblogs.com/Qinstudy/ 文章來源:http://www.cnblogs.com/Qinstudy/p/Qinstudy.html 【正文】 秦學苦練博主,你好!我是立志要掌握Java編程語言的一名小白, ...
  • (一) URL地址 URL地址組件 URL組件 說明 scheme 網路協議或下載方案 net_loc 伺服器所在地(也許含有用戶信息) path 使用(/)分割的文件或CGI應用的路徑 params 可選參數 query 連接符(&)分割的一系列鍵值對 fragment 指定文檔內特定錨的部分 n ...
  • #推薦一本書《Python核心編程》(適合有一定基礎的),美國人Wesley Chun編寫的,京東、淘寶應該都有。我是覺得寫的很好,詳細、簡潔、滿滿的乾貨,不像有的書整本看完也沒什麼用。 (一) Web框架 Web開發除了全部從底層寫起,還可以在其他人已有的基礎上進行開發,簡化開發流程。這些Web開 ...
  • 已知,1900年1月1日是星期1,用戶隨機輸入年月日,計算星期幾 代碼如下(未改進),歡迎批評指正 year=int(input('year')) month=int(input('month')) day=int(input('day')) if year >=1900:#大於等於1900 rye ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...