漫談大型網站架構

来源: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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...