漫談大型網站架構

来源:https://www.cnblogs.com/baiyu28/archive/2018/07/10/9288725.html
-Advertisement-
Play Games

大型網站架構從來都不是一個預先定義的架構,而是一個演進式的架構。很少有一個網站從建站開始,就能夠因具備大型網站的所有屬性而一成不變的,從最簡單的LAMP架構,再到基於IOE的大型集中式應用架構,再演變成時下的分散式應用架構,隨著網站用戶規模的擴大,架構也在不斷演進。從實體機到虛擬機再到當前流行的Do... ...


大型網站架構從來都不是一個預先定義的架構,而是一個演進式的架構。很少有一個網站從建站開始,就能夠因具備大型網站的所有屬性而一成不變的,從最簡單的LAMP架構,再到基於IOE的大型集中式應用架構,再演變成時下的分散式應用架構,隨著網站用戶規模的擴大,架構也在不斷演進。從實體機到虛擬機再到當前流行的Docker技術,從單機房到同城多機房再到異地多活,從LAMP到J2EE再到各種分散式中間件如服務框架、分散式消息隊列、配置管理中間件、分散式數據訪問層,由簡至繁的艱難蛻變,也正是一個網站從小變大由弱變強的成長歷程,哪裡有挑戰,哪裡才會有變革,這正是作為技術人建功立業的時刻。

 

規模不斷擴大,但成本不可能隨之線性增長,因此,如何利用規模效應降低資源成本,抽取公共部分,避免重覆造輪子,提高開發效率和響應速度,成了必須思考的問題。技術存在的核心價值就是為了生產力的提高,當技術架構制約了生產力發展,就需要進行技術變革。當前支撐大型網站的幾大核心技術,分散式、服務化、虛擬化,其中分散式解決的是規模化帶來的問題,所謂的規模化即包括數據規模越來越大,訪問量越來越高,也包括開發團隊規模越來越大,工程代碼規模越來越大。

 

單機的存儲能力以及負載能力必然有限,從PC到小型機再到中型機、大型機,成本將成指數級升高,而成百上千人開發同一個工程,則導致系統臃腫,開發、發佈效率極低,互聯網將喪失了賴以生存的靈活性,回到以前傳統軟體的開發模式。通過應用垂直拆分,集群分散式水平擴展,不僅使系統容量得到提升,存儲和負載將分配到大規模的廉價集群上,以降低成本,開發效率和開發模式也得到改變。

 

通過公共業務抽取,將誕生一批處於系統底層的基礎服務,避免相同的內容重覆造輪子,提高開發效率。作為大型網站架構中最重要的中間件,服務化框架簡化了服務調用所涉及的對象序列化與反序列化,通信協議,服務路由等操作,以及到後來誕生的一個新名詞—服務治理,去梳理服務的依賴關係、調用鏈路、強弱依賴等等更複雜的問題。

 

除此之外,在架構師的武器庫中,還有眾多不同應用場景下使用的中間件,如消息中間件、 分散式數據訪問層、配置管理中心、數據遷移工具、分散式文件系統等等,這些都是日常系統架構中的粘合劑。大型網站的另外一個核心技術就是資源的虛擬化,從實體機到Xen、KVM再到基於LXC的輕量級虛擬化方案,再到Docker,技術的更新換代使得資源的利用率越來越高,集群的運維、部署和管理越來越方便。

 

另外不同的場景下如何選擇存儲也十分重要,高併發和大數據往往都不會單獨出現,到底是採用磁碟、SSD還是採用記憶體,到底是採用分散式文件系統,關係資料庫,還是NOSQL,還是採用記憶體分散式緩存,不同的場景下方案會大相徑庭,分散式文件系統存儲容量幾乎可以理解為無限,但是吞吐低,關係型資料庫有嚴謹的schema以及功能強大的SQL語句,可以滿足各種複雜的查詢條件,但無奈擴展太麻煩,為了應對高併發讀寫訪問,master-slave、讀寫分離、分庫分表一折騰,不僅工作量大增,且查詢維度受限,還需要引入垂直化搜索引擎來擴展查詢維度,NOSQL雖然能自動分區擴容,但無奈不支持SQL,而緩存雖快,記憶體條又太貴,架構就是要不斷的權衡取捨。

 

大公司之所以不如小公司響應速度快,原因在於大公司有太多積累,有時候積累多了也會成為包袱,現有的模型會使得新業務難以快速融入。當遇到問題和挫折的時候,就是思考改進和系統變革的時候,從來沒有哪個系統在設計好之後就封存代碼永不改變的,技術永遠是不斷發展,需求和市場也是不斷變化的,因此不要指望用一種架構滿足所有的需求,系統設計需要滿足一段時間內的可擴展性,但千萬不要過度設計,因為過了半年之後你回過頭來重新review,你會發現需求早已改變,這就是互聯網的快節奏。

 

對於系統的架構來說,一段時間之內架構的演變,常常會經歷從清晰,再到模糊混亂,再重構,再清晰,然後又變得模糊的過程,市場環境總是瞬息萬變的,因此,系統的設計要遵循對擴展開放,對修改封閉的原則,做到這點即可方便及時的接入新流程,又能夠不影響既有的流程。從巨集觀來看,各個系統間的關係一定不是煙囪與煙囪的關係,而是猶如城市裡的高樓大廈,通過公路連接起來,因此,要提高建房子的速度,就要充分利用已有的基礎設施,已有的中間件,來降低系統構建的成本和風險。

 

架構設計的幾個層次,沒有架構也是架構,專註於解決現有問題也能稱為架構,而好的架構應該是即能夠約束開發者又能夠解放開發者使其專註於功能的設計。儘量將複雜的事情變的簡單,而不要將簡單的事情變的複雜,技術從來都不是用來炫的,而是用來解決實際問題的,因此我們不需要花拳繡腿,洛克希德·馬丁公司的著名飛機設計師凱利·約翰遜所提出的KISS原則,就是最好的詮釋。風險驅動的架構理念告訴我們,避免失敗是所有工程技術的核心,架構也是技術,運用架構技術去緩解風險,避免走極端,是架構師的最根本職責。

微信公眾號:IT哈哈。


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

-Advertisement-
Play Games
更多相關文章
  • 1. 瀏覽器載入 (1) 同步載入 在網頁中,瀏覽器載入js文件的方式是通過<script>標簽。如下所示: <script>標簽很方便,只要加入後,瀏覽器便可讀取並運行,但是在讀取的時候,瀏覽器是按照<script>標簽的出現順序,讀取Javascript文件,然後立即運行,導致在多個文件相互依賴 ...
  • 1.評估功能變數名稱類型 .com——商業實體 .edu——僅限有學位或更高等學歷授予資格的高等教育使用 .gov——僅限政府使用 .net——與Internrt網路支持相關的團體,通常是Internet服務提供商或者電信公司 .org——非盈利組織 2.HTML -HTML是一套標記符號或者代碼集,他們插 ...
  • 一、理解 1、什麼是模塊、模塊化? 將一個複雜的程式依據一定的規範封裝成幾個文件,併進行組合在一起 2、為什麼要模塊化? 降低複雜度,提高解耦性,部署方便 3、模塊化的好處 避免命名衝突(減少命名空間污染) 更好的分離,按需載入 更高復用性 高可維護性 4、頁面引入載入script 二、模塊化規範 ...
  • 1.Socket簡介 Socket也稱作“套接字“,是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用層調用以實現進程在網路中通信。它分為流式套接字和數據包套接字,分別對應網路傳輸控制層的TCP和UDP協議。TCP協議是一種面向連接的、可靠的、基於位元組流的傳輸 ...
  • 相信看過 每天學點SpringCloud(一):簡單服務提供者消費者調用的同學都發現了,在最後消費者調用提供者的時候把提供者的地址硬編碼在了代碼中,這樣的方式肯定是不行的,今天,我們就是要Eureka來解決這個問題 創建Eureka服務 1.我們在原先項目的基礎上再新建一個項目cloud-demo- ...
  • 微服務 將整體功能按著模塊劃分成多個獨立的單元,這些單元可以獨立部署,它們之前通過輕量級的web api方式進行通訊,對於微服務框架來說,最流行的就是springcloud和Service Fabric,前者是java開發,後者是.net的產品,今天主要介紹一下springcloud! 參考文章:h ...
  • 系統介紹: 1.系統採用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC瀏覽器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通java web(非maven, 附贈pom.xml文件) 資料庫:mysql 3.開發工具:my ...
  • 基於.net core 的微服務,網上很多介紹都是千篇一律基於類似webapi,通過http請求形式進行訪問,但這並不符合大家使用習慣.如何像形如[ GetService<IOrderService>().SaveOrder(orderInfo)]的方式, 調用遠程的服務,如果你正在為此苦惱, 本文 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...