互聯網架構的演變過程(一)

来源:https://www.cnblogs.com/ambitionutil/archive/2019/07/22/11228956.html
-Advertisement-
Play Games

簡介 簡介 web1.0時代 web2.0時代 互聯網時代 互聯網+ --》智慧城市。 2012年提出。 雲計算+大數據時代 背景 背景 隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。 1、第一 ...


 

簡介

web1.0時代

web2.0時代

互聯網時代 互聯網+ --》智慧城市。 2012年提出。

雲計算+大數據時代

背景

隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。

 

 

1、第一時期

單一應用架構

all in one(所有的模塊在一起,技術也不分層)

 

網站的初期,也認為互聯網發展的最早時期。會在單機部署上所有的應用程式和軟體。

所有的代碼都是寫在JSP裡面,所有的代碼都寫在一起。這種方式稱為all in one。

特點:

1、不具備代碼的可維護性。

2、容錯性差。

​ 因為我們所有的代碼都寫在JSP頁里。當用戶或某些原因發生異常。(1、用戶直接看到異常錯誤信息。2、這個錯誤會導致伺服器宕機)

容錯性,是指軟體檢測應用程式所運行的軟體或硬體中發生的錯誤並從錯誤中恢復的能力,通常可以從系統的可靠性、可用性、可測性等幾個方面來衡量。

單體地獄。:只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。

2 第一時期後階段

解決方案:

1、分層開發(提高維護性)【解決容錯性】

2、MVC架構(Web應用程式的設計模式)

3、伺服器的分離部署

 

 

特點:

1、MVC分層開發(解決容錯性問題)

2、資料庫和項目部署分離

問題:

隨著用戶的訪問量持續增加,單台應用伺服器已經無法滿足需求。

解決方案:

集群。

3 可能會產生的幾個問題:

1.1. 高可用

“高可用性”(High Availability)通常來描述一個系統經過專門的設計,從而減少停工時間,而保持其服務的高度可用性。(一直都能用)

1.2. 高併發

高併發(High Concurrency)是互聯網分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。

高併發相關常用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),併發用戶數等。

響應時間:系統對請求做出響應的時間。例如系統處理一個HTTP請求需要200ms,這個200ms就是系統的響應時間。

吞吐量:單位時間內處理的請求數量。

QPS:每秒響應請求數。在互聯網領域,這個指標和吞吐量區分的沒有這麼明顯。

併發用戶數:同時承載正常使用系統功能的用戶數量。例如一個即時通訊系統,同時線上量一定程度上代表了系統的併發用戶數。

1.2.1. 提升系統的併發能力

提高系統併發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out)。

1. 垂直擴展

垂直擴展:提升單機處理能力。垂直擴展的方式又有兩種:

(1)增強單機硬體性能,例如:增加CPU核數如32核,升級更好的網卡如萬兆,升級更好的硬碟如SSD,擴充硬碟容量如2T,擴充系統記憶體如128G;

(2)提升單機架構性能,例如:使用Cache來減少IO次數,使用非同步來增加單服務吞吐量,使用無鎖數據結構來減少響應時間;

在互聯網業務發展非常迅猛的早期,如果預算不是問題,強烈建議使用“增強單機硬體性能”的方式提升系統併發能力,因為這個階段,公司的戰略往往是發展業務搶時間,而“增強單機硬體性能”往往是最快的方法。

總結:不管是提升單機硬體性能,還是提升單機架構性能,都有一個致命的不足:單機性能總是有極限的。所以互聯網分散式架構設計高併發終極解決方案還是水平擴展。

2. 水平擴展

水平擴展:只要增加伺服器數量,就能線性擴充系統性能。水平擴展對系統架構設計是有要求的,難點在於:如何在架構各層進行可水平擴展的設計,

可擴展性。

1.3. 高性能

高性能(High Performance)就是指程式處理速度快,所占記憶體少,cpu低

4、集群操作

集群:同一個業務,部署在多個伺服器上。

 

 

特點:

1、項目採用多台伺服器(集群)部署

優點:

​ 支持高併發。

​ 支持高可用。


問題1 Session如何共用?

答: Redlis Cluster集群方案

問題2這些集群的伺服器,用戶的請求該往哪裡進行轉發?

答: 用nginx伺服器來完成分發請求。實現負載均衡策略機制。

 

註意:很多IT公司用的都是這種架構需求

 

資料庫壓力變大

我們能過集群方案nginx+tomcat將應用層的性能進行有效的提升。但是資料庫的負載奪力慢慢增加。怎麼來搞高資料庫層面的訪問壓力(負載)?

解決方案:

讀寫分離

 

讀寫分離:主從資料庫之間進行數據同步。master負載增刪改操作。 slave負載讀操作。

mysql本身就提供了master-slave的方式完成主從複製功能。

使用搜索引擎緩解資料庫的訪問壓力+能力

資料庫做讀庫的情況下,資料庫本身對模糊查詢的功能支持不是特別優秀,像電商類的網站,搜索是非常核心的功能模塊。即使做了讀寫分離。這個問題也不能有效解決電商網站查詢(分詞技術)等。針對於該問題,有必要引入搜索引擎技術。

目前非常主流的搜索引擎技術:

solr  elasticsearch  whoosh

 

 

引入緩存機制減輕資料庫的訪問壓力

隨著訪問量的持續增加,資料庫的訪問壓力變的越來越大(雖然做了主從複製)。對於這些熱點數據(用戶訪問頻繁的信息),如果每都到資料庫中進行查詢。(很多通用查詢的功能)。

放在記憶體中又不特別合適。(手機登錄驗證碼操作、為了IP限制頻繁訪問伺服器...) 嘗試使用Redis.

資料庫的水平/垂直拆分。

垂直擴展 能力終歸還是有限的。

單個表: 1000萬--》1個億數據 (單個表的數據能力終歸還是有限的)

表:垂直拆分。

id ,name,age,bire..tel...remark....

熱數據/冷數據 --》垂直拆分方案。

表:水平拆分。

按照:時間、地區、(按照業務邏輯進行拆分)。

分庫分表:

採用第三方資料庫中間件:mycat sharding-jdbc drds(阿裡)

 

 

當前狀態特點:

通過設計保證高可用、高併發。

(不斷的對伺服器進行擴容...)


問題1伺服器價錢?(伺服器維護成本、人工維護)?

問題2可維護性差。

問題3可擴展性差(組件重用性基本沒有)

問題4協同開發不方便。(大家都去改相同的業務代碼。易發生代碼錯誤/衝突)

問題5單體架構(隨著業務的不斷增加,代碼會變得越來越多)。導致服務部署時,文件變的越來越大。

 


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

-Advertisement-
Play Games
更多相關文章
  • 第八章 複雜搜索 黑夜給了我黑色的眼睛,我卻用它尋找光明。 經過瞭解簡單的API和簡單搜索,已經基本上能應付大部分的使用場景。可是非關係型資料庫數據的文檔數據往往又多又雜,各種各樣冗餘的欄位,組成了一條"記錄"。複雜的數據結構,帶來的就是複雜的搜索。所以在進入本章節前,我們要構建一個儘可能"複雜"的 ...
  • https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html ...
  • 1、static介紹 static關鍵字一直是各大企業中面試常常會問到的問題,主要考察面試者的基礎是否扎實,下麵來介紹一下static關鍵字。 Java中static表示“全局”或者“靜態”的意思,可以用來修飾成員變數、成員方法、代碼塊、內部類和導包。在Java中並不存在全局變數的概念,但是我們可以 ...
  • 響應數據和結果視圖 返回值分類 1.返回值是String 返回值類型是字元串的,會根據返回的字元串去尋找相對應的jsp頁面 2.返回值是Void 預設請求路徑是什麼就會去尋找請求路徑的jsp 編寫請求轉發和重定向的程式和直接響應 返回值是ModelAndView對象 (存JavaBean對象和跳轉頁 ...
  • 前言 今天我們一起學習下java.util.concurrent併發包里的 "CopyOnWriteArrayList" 工具類。當有多個線程可能同時遍歷、修改某個公共數組時候,如果不希望因使用 synchronize 關鍵字鎖住整個數組而影響性能,可以考慮使用CopyOnWriteArrayLis ...
  • 新聞 "ML.NET 1.2發佈,包含Model Builder升級" "NuGet.org上現在顯示GitHub的使用情況" "微基準測試設計準則" "為線程添加mono.wasm支持" "Haskell——經驗總結" "MSBuild二進位與結構日誌瀏覽器" 視頻及幻燈片 "F MonoGame ...
  • 常用方法 首先,我們應該知道HashMap類實現了Map介面,所以實現了Map常用的一些方法。 (1) 插入鍵值對數據 public V put(K key, V value) (2)根據鍵值獲取鍵值對值數據 public V get(Object key) (3)獲取Map中鍵值對的個數 publ ...
  • 我是大劉啊~ 堅持每周更新最少一次,為年薪20萬邁進! 我為什麼要學Python? 答:我想要漲工資。。。家裡有礦我就不會來燒腦了。。。。。。 先寫點什麼呢? 新手,hhh,激動無比,無從下爪。。。。 python基本的數據類型吧 正題:python基本的數據類型 1、整數(int):就是整數,上過 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...