讀構建可擴展分散式系統:方法與實踐01可擴展系統簡介

来源:https://www.cnblogs.com/lying7/p/18406273
-Advertisement-
Play Games

1. 簡介 1.1. 在過去20年裡,軟體系統的規模、複雜性和容量都出現了前所未有的增長 1.2. 代碼是容器、資料庫、消息傳遞系統和其他組件的一部分,通過調用API和構建指令,構成你的應用程式 1.3. 可擴展(scalable)是軟體工程中用來描述軟體系統能夠適應增長的術語 1.3.1. 可擴展 ...


1. 簡介

1.1. 在過去20年裡,軟體系統的規模、複雜性和容量都出現了前所未有的增長

1.2. 代碼是容器、資料庫、消息傳遞系統和其他組件的一部分,通過調用API和構建指令,構成你的應用程式

1.3. 可擴展(scalable)是軟體工程中用來描述軟體系統能夠適應增長的術語

  • 1.3.1. 可擴展性是一個非常簡單的概念

1.4. 快速且低成本地擴展應用程式的能力應該是當代面向互聯網的應用程式的軟體架構的決定性質量

2. 定義

2.1. 維基百科對它的定義是“可擴展性是通過添加更多資源來處理越來越多的工作的系統屬性”​

2.2. 與物理系統不同,軟體系統在某種程度上是無定形的

  • 2.2.1. 它們並非是通過外部觀察就能瞭解其內部行為的東西

  • 2.2.2. 一個軟體系統就是一個數字工件(artifact)

2.3. 不同運營維度的例子

  • 2.3.1. 系統可以同時處理的來自用戶或外部設備(例如感測器)的請求的數量

  • 2.3.2. 系統可以有效處理和管理的數據量

  • 2.3.3. 對系統存儲的數據進行預測分析而獲得的價值

  • 2.3.4. 隨著請求量的增長,系統保持穩定、一致的響應時間的能力

2.4. 在開發和部署的早期階段,可擴展性並不是主要的質量要求

  • 2.4.1. 在有明確的需求之前引入一些複雜的分散式技術可能對項目有害,額外的複雜性會導致開發過於保守

2.5. 成功擴展系統關係到許多現代互聯網應用程式的生存問題

  • 2.5.1. 在系統的發展過程中,提高系統性能和可擴展性成為當務之急甚至影響系統存亡的現象比比皆是

2.6. 往往存在一個臨界點,在輕負載下有意義的設計和決策突然變成了技術債務

2.7. 通過增加資源來增加系統在某個維度上的容量稱為縱向擴展(scaling up)或橫向擴展(scaling out)

2.8. 與物理系統不同,能夠按比例縮小(scale down)系統容量以降低成本同樣重要

  • 2.8.1. 一個非常典型的例子是Netflix,它需要處理來自不同區域的可預測的晝夜請求

2.9. 案例

  • 2.9.1. Scribe是一種自定義緩存隊列解決方案,它可以以每秒幾TB的速率從伺服器傳輸日誌,並將它們傳送到下游分析和數據倉庫系統中

  • 2.9.2. 互聯網站點提供的關於服務規模的真實且具體的數據仍然是商業機密

3. 軟體系統發展簡史

3.1. 1980~1989

  • 3.1.1. 一個由分時主機和小型機主宰的時代

  • 3.1.2. 個人電腦出現於20世紀80年代初期,但很少聯網

  • 3.1.3. 萬維網在20世紀80年代誕生於歐洲核子研究中心(CERN),由Tim Berners-Lee首創

3.2. 1990~1995

  • 3.2.1. 網路變得更加普遍,為基於HTTP/HTML的萬維網(WWW)技術的出現創造了成熟的環境

  • 3.2.2. 1994年雅虎(Yahoo!)創立

  • 3.2.3. 1995年亞馬遜和eBay誕生

3.3. 1996~2000

  • 3.3.1. 網站數量從10000左右增長到1000萬

  • 3.3.2. 亞馬遜、eBay、谷歌和雅虎等公司已經開創了許多設計原則和先進技術的早期版本

3.4. 2001~2006

  • 3.4.1. 網站數量從約1000萬個增長到8000萬個

  • 3.4.2. 2005年,YouTube推出

    • 3.4.2.1. 第一次上傳視頻到YouTube發生在2005年
  • 3.4.3. 2006年,Facebook向公眾開放

    • 3.4.3.1. 亞馬遜網路服務(AWS)重新推出了S3和E C2服務

3.5. 2007至今

  • 3.5.1. 大約擁有20億個網站

  • 3.5.2. 大約有40億互聯網用戶

4. 可擴展性系統設計基本原則

4.1. 擴展系統的基本目標是在應用程式的某些特定維度上增加容量

4.2. 一個常見的維度是增加系統在給定時間段內可以處理的請求數量

  • 4.2.1. 系統的吞吐量

4.3. 複製

  • 4.3.1. 在軟體系統中增加容量的第一個策略

  • 4.3.2. 我們基本上複製了軟體中處理請求的資源,以提供更多的請求處理能力,從而提高吞吐量

  • 4.3.3. 在基於雲的軟體系統中,只需點擊滑鼠即可實現複製,我們可以有效地複製用來處理請求的資源,高達數千倍

4.4. 優化

  • 4.4.1. 如果我們通過以下方法可以優化請求的處理,那麼可以在不增加資源的情況下提高系統能力

    • 4.4.1.1. 使用更有效的演算法

    • 4.4.1.2. 在資料庫中添加額外的索引以加快查詢速度

    • 4.4.1.3. 用更快的編程語言重寫伺服器

      4.4.1.3.1. Facebook創建的用於PHP的HipHop

      4.4.1.3.2. HipHop將PHP代碼編譯為C++,將Facebook的網頁生成速度提高了6倍

5. 可擴展性與成本

5.1. 對於某些應用程式,需要承擔修改業務系統來滿足最終業務需求的成本

5.2. 不應該期望一個沒有採用可擴展架構、機制和技術的軟體系統快速發展以滿足更大的容量需求

5.3. 在成本線性增長的同時支持指數級擴展的軟體系統被稱為超大規模系統

6. 權衡

6.1. 可擴展性是非功能性需求,它只是眾多質量屬性之一

6.2. 經驗豐富的軟體架構師非常註意分寸,他們精心設計系統來滿足高優先順序的質量屬性,同時儘量減少對其他質量屬性的負面影響

7. 可用性

7.1. 可用性和可擴展性通常是高度相容的“合作伙伴”

  • 7.1.1. 當我們複製資源來擴展自己的系統時,我們創建了多個服務實例,可用於處理來自任何用戶的請求

  • 7.1.2. 如果一個實例出現故障,則其他實例仍然可用

  • 7.1.3. 系統容量減少的原因只是應用程式出現故障或資源不可用

7.2. 可用性是指系統即使在對手的攻擊下也仍然保持可靠運行的能力

7.3. 來自對手的攻擊可能是試圖利用系統設計弱點使系統癱瘓

7.4. 另一種攻擊則是經典的分散式拒絕服務(DDoS),在這種攻擊中,對手獲得了對眾多系統和設備的控制權,並協同大量請求,使得受害系統不可用

8. 安全性

8.1. 安全系統的基本要素是身份驗證、授權和數據完整性

8.2. 安全性是所有面向互聯網的系統的必要質量屬性

8.3. 構建安全系統的成本是不可避免的

8.4. TLS使用非對稱加密提供加密、身份驗證和數據完整性能力

  • 8.4.1. 由於雙方都需要生成和交換密鑰,所以會產生性能成本

  • 8.4.2. 建立連接後,傳輸中的數據將使用對稱加密技術進行加密,由於現代CPU具有專用的加密硬體,因此這部分的性能損失可以忽略不計

  • 8.4.3. 建立連接通常需要在客戶端和伺服器之間進行兩次消息交換,因此速度較慢

  • 8.4.4. 儘可能重用連接可以最大限度地減少性能開銷

8.5. 保護靜態數據

  • 8.5.1. SQL Server和Oracle等流行資料庫引擎具有透明數據加密(TDE)等功能,可提供高效的文件級加密

  • 8.5.2. 靜態安全數據的開銷是實現安全性必須承擔的成本

    • 8.5.2.1. 研究表明開銷在5%~10%的範圍內

8.6. 一般來說,安全性和可擴展性是對立的力量

  • 8.6.1. 安全必然會導致性能下降

  • 8.6.2. 系統包含的安全層越多,性能和可擴展性的負擔就越大

9. 可管理性

9.1. 用於描述這種複雜監控功能的術語是可觀測性

9.2. 指標對於洞察系統是非常寶貴的,它有助於確保持續運營,以及凸顯系統中可能需要優化或複製的部分

9.3. 擴展系統總是意味著添加新的系統組件——硬體和軟體

  • 9.3.1. 它增加了系統操作的複雜性和監控成本,這需要開發更多的監控代碼來調整可觀測平臺,確保其監控了新的系統組件

9.4. 在擴展時,控製成本和可管理性的複雜性的唯一方法是自動化

9.5. DevOps自動執行系統的持續測試、部署、管理、升級和監控,縮短了新功能的開發生命周期

  • 9.5.1. 它是所有成功的可擴展系統的組成部分

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

-Advertisement-
Play Games
更多相關文章
  • title: Nuxt Kit 的使用指南:模塊創建與管理 date: 2024/9/11 updated: 2024/9/11 author: cmdragon excerpt: 摘要:本文是關於Nuxt Kit的使用指南,重點介紹瞭如何使用defineNuxtModule創建自定義模塊及inst ...
  • 1. 分散式緩存 1.1. 緩存存在於應用程式的許多地方 1.1.1. 行應用程式的CPU具有高速多級硬體緩存,可以減少相對較慢的主記憶體訪問 1.1.2. 資料庫引擎可以利用主記憶體來緩存數據存儲的內容,這樣在許多情況下查詢就可以不用訪問速度相對較慢的磁碟 1.2. 分散式緩存是可擴展系統的重要組成部 ...
  • 1. 應用服務 1.1. 任何系統的核心都在於實現應用需求的特定業務邏輯 1.2. 服務是可擴展軟體系統的核心 1.2.1. 它們將契約定義為一個API,向客戶端聲明它們的能力 1.3. 應用伺服器高度依賴於編程語言,但通常都會提供多線程編程模型,允許服務同時處理許多請求 1.4. 多服務配置意味著 ...
  • 商業模式 商業模式是幫助企業成功的“秘訣”,它通過整合企業內外部的多種要素,構建起一個全面、高效且具有獨特競爭優勢的運營體系。這一體系的目的是滿足市場的需求,實現各利益相關者價值最大化,並確保企業的長期盈利能力。 商業模式的核心架構由三個緊密相連的環節構成:創造價值、傳遞價值和獲取價值。 創造價值: ...
  • 1. 通信基礎 1.1. 每個分散式系統都包含通過網路進行通信的軟體組件 1.2. 硬體 1.2.1. 全球互聯網就是一臺異構機器,由不同類型的網路通信通道和設備組成,它們每秒將數百萬條消息通過網路傳送到預定目的地 1.2.2. 對於單個光纖鏈路,可以提供每秒超過70 Tbps的總帶寬 1.2.3. ...
  • 大家好,我是湯師爺~ 在工作當中,我們經常會聽到以下說法: 產品負責人說,現在的業務架構太複雜,需要仔細梳理下。 技術領導說,這個項目很複雜,需要做下系統架構方案評審。 研發經理說,這次秒殺活動訪問量非常大,需要用到高併發架構方案。 一線研發說,互聯網大廠都會用到微服務架構,我要學學微服務架構設計。 ...
  • 1. 系統架構基礎 1.1. 幾乎所有大規模系統都是從小規模開始,在成功路上逐漸發展壯大 1.2. 通信使用標準的應用層網路協議,通常是HTTP 1.3. Java EE和Java的Spring框架 1.4. Python的Flask 1.5. 隨著應用程式的特性變得更加豐富,單體應用程式的複雜性往 ...
  • 狀態模式(State Pattern)的定義是這樣的:類的行為是基於它的狀態改變的。註意這裡的狀態不是狹義的指對象維護了一個“狀態”欄位,我們傳入了不同的枚舉值,對象整體的表現行為(對外方法)就改變了。而是指內部的(任意)欄位如果發生了變化,那麼它的狀態就變了,那麼它對外的表現形式就變了。狀態模式是 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...