打算開一個系列講講架構,之前的經驗主要是在互聯網架構這一塊,最近在整理分析比特幣,以太坊,EOS的架構,所以準備寫一個系列的文章談談對互聯網架構和區塊鏈架構的理解。會分為四篇文章,1.互聯網產品的架構、2.比特幣架構分析、3.以太坊的架構分析、4.EOS架構分析。

系統架構到底是什麼?

架構=抽象。

系統架構,就是洞悉業務系統,抽線出業務系統的組件以及之間的關係。

我們面對的現實業務和需求可能太龐大了,如果不去分解我們的構建根本都無法下手,我們就無法真正理解業務細節。因此子系統和組件劃分是分解重要內容,分解重要原則是高內聚,松耦合。由於分解產生了組件間的交互,因此需要根據關注介面的分析和設計,架構師的一個關鍵職能就是要屏蔽系統本身複雜性,將複雜性作為一個黑盒控制在自己手裡,對外只需要暴露儘可能簡單的介面。而在分解的時候又必須要考慮集成,架構師在自己腦海裡面已經有了目標系統的樣子,他們會很有信心分解的組件能夠通過當初定義的介面很好的集成在一起。正如汽車製造一樣,所有的零備件都出來了卻發現它們根本無法組裝成一臺汽車。這對架構師是最大的悲哀,系統都還沒有出來,而架構師就能夠遊刃有餘的做這些事情,靠的不僅僅是多年的設計和開發實踐,更多的則是在實踐過程中的抽象思維。

如何進行系統架構?

面對複雜的業務需求,如果對整個系統進行架構設計呢?

1.洞悉業務,洞悉業務未來可能的擴展方向以及基本特徵。

2.抽象業務組件以及關係

3.分解業務,技術方案確認以及風險評估

4.制定總體計劃以及檢查點

架構本身不是目標,而簡單實用並且支持靈活擴展的系統纔是我們追求的目標。架構師思維意識裡面更加重要的是實用性和經濟性而非理想化,由於業務域和問題域的不同沒有完全可以照搬的架構,在架構設計上追求一定的可擴展性。要杜絕過度架構和架構理想化的問題,就如何建造一個建築,如果我們最終得不到一個實用的的建築物,你再怎麼向客戶吹噓你的設計圖紙和建造框架如何合理都是徒勞的。系統架構演化可用到的技戰術。

  • 將應用伺服器進行業務拆分

隨著業務進一步擴展,應用程序變得非常臃腫,這時我們需要將應用程序進行業務拆分,如百度分為新聞、網頁、圖片等業務。每個業務應用負責相對獨立的業務運作。業務之間通過消息進行通信或者同享資料庫來實現。 各個業務應用都會使用到一些基本的業務服務,例如用戶服務、訂單服務、支付服務、安全服務,這些服務是支撐各業務應用的基本要素。我們將這些服務抽取出來利用分部式服務框架搭建分散式服務

  • 應用、數據、文件分離

隨著業務的擴展,一臺伺服器已經不能滿足性能需求,故將應用程序、資料庫、文件各自部署在獨立的伺服器上,並且根據伺服器的用途配置不同的硬體,達到最佳的性能效果。

  • 緩存改善網站性能在硬體優化性能的同時,同時也通過軟體進行性能優化,在大部分的網站系統中,都會利用緩存技術改善系統的性能,使用緩存主要源於熱點數據的存在,大部分網站訪問都遵循28原則(即80%的訪問請求,最終落在20%的數據上),所以我們可以對熱點數據進行緩存,減少這些數據的訪問路徑,提高用戶體驗。緩存實現常見的方式是本地緩存、分散式緩存。當然還有CDN、反向代理等,這個後面再講。本地緩存,顧名思義是將數據緩存在應用伺服器本地,可以存在內存中,也可以存在文件,OSCache就是常用的本地緩存組件。本地緩存的特點是速度快,但因為本地空間有限所以緩存數據量也有限。分散式緩存的特點是,可以緩存海量的數據,並且擴展非常容易,在門戶類網站中常常被使用,速度按理沒有本地緩存快,常用的分散式緩存是Memcached、Redis。
  • 使用集羣改善應用伺服器性能應用伺服器作為網站的入口,會承擔大量的請求,我們往往通過應用伺服器集羣來分擔請求數。應用伺服器前面部署負載均衡伺服器調度用戶請求,根據分發策略將請求分發到多個應用伺服器節點。常用的負載均衡技術硬體的有F5,價格比較貴,軟體的有LVS、Nginx、HAProxy。LVS是四層負載均衡,根據目標地址和埠選擇內部伺服器,Nginx是七層負載均衡和HAProxy支持四層、七層負載均衡,可以根據報文內容選擇內部伺服器,因此LVS分發路徑優於Nginx和HAProxy,性能要高些,而Nginx和HAProxy則更具配置性,如可以用來做動靜分離(根據請求報文特徵,選擇靜態資源伺服器還是應用伺服器)。
  • 資料庫讀寫分離和分庫分表

    隨著用戶量的增加,資料庫成為最大的瓶頸,改善資料庫性能常用的手段是進行讀寫分離以及分表,讀寫分離顧名思義就是將資料庫分為讀庫和寫庫,通過主備功能實現數據同步。分庫分表則分為水平切分和垂直切分,水平切換則是對一個資料庫特大的表進行拆分,例如用戶表。垂直切分則是根據業務不同來切換,如用戶業務、商品業務相關的表放在不同的資料庫中。

  • 使用CDN和反向代理提高網站性能

假如我們的伺服器都部署在成都的機房,對於四川的用戶來說訪問是較快的,而對於北京的 用戶訪問是較慢的,這是由於四川和北京分別屬於電信和聯通的不同發達地區,北京用戶訪問需要通過互聯路由器經過較長的路徑才能訪問到成都的伺服器,返迴路徑也一樣,所以數據傳輸時間比較長。對於這種情況,常常使用CDN解決,CDN將數據內容緩存到運營商的機房,用戶訪問時先從最近的運營商獲取數據,這樣大大減少了網路訪問的路徑。比較專業的CDN運營商有藍汛、網宿。而反向代理,則是部署在網站的機房,當用戶請求達到時首先訪問反向代理伺服器,反向代理伺服器將緩存的數據返回給用戶,如果沒有沒有緩存數據才會繼續走應用伺服器獲取,也減少了獲取數據的成本。反向代理有Squid,Nginx。

  • 使用分散式文件系統&使用NoSql和搜索引擎用戶一天天增加,業務量越來越大,產生的文件越來越多,單臺的文件伺服器已經不能滿足需求。需要分散式的文件系統支撐。常用的分散式文件系統有NFS。對於海量數據的查詢,我們使用nosql資料庫加上搜索引擎可以達到更好的性能。並不是所有的數據都要放在關係型數據中。常用的NOSQL有mongodb和redis,搜索引擎有lucene。

架構師需要哪些能力?

優秀架構師應該從「四度」進行學習和提升,同時這也是優秀架構師應該具備的能力。

  • 廣度

廣度指的是架構師應該對所在領域的主流技術體繫有一個全面清晰的認識,每一種技術不需要很深入的瞭解,但必須知道每種技術的3W:

1,Why:每種技術的由來,為什麼會出現這種技術,這個技術是用來解決什麼問題的?

2,What:每種技術是什麼?技術的基本組成部分是什麼?3,Which:解決同一問題的相同技術各自的優缺點是什麼,更適合哪種場景?比如,ORM框架(Hibernate與IBatis),MVC框架(Struts與SpringMVC),大數據技術(Hadoop與Spark)它們各自的優缺點是什麼,只有清晰認識同一類型技術的優缺點,才能在技術選型時能夠使用更加合理的技術。廣度的學習方法:對各主流技術一一通過搜索引擎瞭解其3W的內容。
  • 高度

高度指的是架構師應具備對客觀事物的「拔高」能力,能夠從紛繁雜亂的信息中建立秩序,也就是我們一般所說的抽象能力。抽象能力包括:

1,業務抽象:能夠軟體和產品的複雜的需求中抽象核心業務實體,並給各業務實體建立合理的關係;

2,技術抽象:能夠對複雜的技術架構進行分層抽象、服務抽象(微服務抽象)、組件抽象,並為各層和各服務之間的調用建立合理的「關係」;

高度的學習方法:深入理解和學習面向對象、設計模式,琢磨優秀開源框架的設計原理和設計思想。

  • 深度

深度指的是架構師能對主流技術有較為深入的理解,主要包括:

1,可以不瞭解源代碼,但對主流技術的原理,運作機理有一個基本的理解;

2,至少對一種技術有深入的認識,是這種技術的專家,熟悉其源代碼

以上2點,1為必須,2為非必須

  • 寬度

寬度指的是架構師能夠熟知當前的技術前沿和熱點,能夠使用新的技術解決問題。比如,微服務、大數據、雲計算、人工智慧等。寬度的學習方法:可以使用手機訂閱相關的技術資訊瞭解,定期瞭解即可,對於跟所負責工作相關的技術進行進一步的瞭解。

小結:

廣度決定了系統架構技術選型的合理性;

高度決定了系統架構設計的合理性;

深度決定了系統架構的優化能力;

寬度決定了系統架構的領先性,不至於三五年被淘汰

四度缺一不可!


推薦閱讀:
相關文章