.NET分散式系統架構思路

来源:https://www.cnblogs.com/hghg/archive/2019/02/28/10449793.html
-Advertisement-
Play Games

分散式系統是由一組通過網路進行通信、為了完成共同的任務而協調工作的電腦節點組成的系統。分散式系統的出現是為了用廉價的、普通的機器完成單個電腦無法完成的計算、存儲任務。其目的是利用更多的機器,處理更多的數據。 一、第一階段 最初假設的網站中,我們把應用系統網站、文件和資料庫都放在一臺伺服器上,一臺 ...


  分散式系統是由一組通過網路進行通信、為了完成共同的任務而協調工作的電腦節點組成的系統。分散式系統的出現是為了用廉價的、普通的機器完成單個電腦無法完成的計算、存儲任務。其目的是利用更多的機器,處理更多的數據。

一、第一階段

  最初假設的網站中,我們把應用系統網站、文件和資料庫都放在一臺伺服器上,一臺伺服器包打天下。

 

 

 

二、第二階段

  隨著業務擴展,一臺伺服器無法滿足性能需求,將應用程式、資料庫、文件分別部署在不同的伺服器上,並根據伺服器用途不同,配置不同的硬體,達到性能最佳的效果。

三、第三階段

  隨著業務擴展,一臺資料庫、網站、文件伺服器再高性能也無法大量數據處理、高併發用戶訪問時,必須考慮採用集群方式。

  1、應用伺服器作為網站的入口,會承擔大量的請求,我們往往通過應用伺服器集群來分擔請求數。應用伺服器前面部署負載均衡伺服器調度用戶請求,根據分發策略將請求分發到多個應用伺服器節點。常用的負載均衡技術硬體的有F5,價格比較貴,軟體的有LVS、Nginx、HAProxy等。

  2、隨著用戶量的增加,資料庫成為最大的瓶頸,改善資料庫性能常用的手段是進行讀寫分離以及分表,讀寫分離顧名思義就是將資料庫分為讀庫和寫庫,通過主備功能實現數據同步。分庫分表則分為水平切分和垂直切分,水平切換則是對一個資料庫特大的表進行拆分,例如訂單、物流信息表等。垂直切分則是根據業務不同來切換,如訂單、計稅等等不同的主題放在不同的資料庫中。這種情況下,關聯查詢是沒有的,通過程式可以比較容易的去解決,還有就是採用分散式事務,來保證數據的一致性。我們這裡還有一個做法,一個大的數據表拆分為當前操作表和歷史記錄表, 當前操作表只保留正在操作的數據,完成後轉入歷史記錄表,這樣可以提高當前操作數據的效率。

  3、用戶一天天增加,業務量越來越大,產生的文件越來越多。通常情況下,一個目錄下的文件建議不能超過1萬個,否則對於文件的查找和輪詢都會非常慢,會導致整個系統無法正常運行。我們一般是按照"\應用程式名\模塊名稱\日期"的目錄結構組織的,對於文件數目仍舊很大的應用,應該再細分。當單台的文件伺服器已經不能滿足需求,就需要分散式的文件系統支撐。常用的分散式文件系統有NFS。我們用的是MS的分散式文件系統(DFS),與AD域相關性較大。

  4、因為應用伺服器是集群方式,用戶前後兩次請求可能訪問的不是一臺伺服器。因此已經不能像以前一樣使用狀態(Application、Session、Cache、ViewState等),應用系統必須是無狀態的(當然了,用的負載均衡具有會話保持的時候,一個用戶只會定位到一臺伺服器)。系統的緩存應該保存在專門的緩存伺服器上,如果必須有狀態,也應該保存在專門的緩存伺服器中。作為第一批吃螃蟹者,我們用了微軟的AppFabric作為緩存伺服器,因為當時版本很低,問題也不少,後來我們棄用了AppFabric,使用Redis作為緩存服務。現在,AppFabric已經改進了不少,運行在Azure雲上,應該是不會存在以前的問題了。

 

中間插一段啊。對於各種政府、單位等不能將系統部署到互聯網的部門,並且在各省、市都有對應的分支機構。因為網路專線的價格還是比較高的,至少比互聯網的網路帶寬低了不少,當然了不差錢的不說啊。這種情況下,一般不採用如上的集中式、集群部署方式,而是採用分散式部署的方式,第一種分散式部署是各分支機構搭建一整套系統,定期(例如每天)進行數據的同步工作,將分支數據彙總到總部、總部的數據下發回各分部;第二種分散式部署方式是各分支部署中間件,但是數據集中在總部。  

四、第四階段

  隨著業務進一步擴展,應用程式變得非常臃腫,這時我們需要將應用程式進行業務拆分。

  如我們做的綜合業務管理系統分為門戶、聯繫處置、業務信息、指標、數據查詢分析等業務板塊。每個業務板塊是一個獨立的應用負責相對獨立的業務運作。業務板塊之間通過消息隊列進行通信來實現。資料庫也進行相應的拆分,不同的主題放到不同的資料庫中。同時,最好搭建靜態資源伺服器,將公用的css、js、images等都存放到靜態資源伺服器中。

五、第五階段

  對於海量數據的查詢,我們使用nosql資料庫加上搜索引擎可以達到更好的性能。

  常用的NOSQL有mongodb和redis,搜索引擎有lucene,我們使用的Solr、ElasticSearch等基於Lucene內核實現的更易用的搜索引擎。數據量大的話,Solr等也要做成集群。

 

六、第六階段

  再往下走,系統需要與其他系統進行交互,系統也要給各種前端(例如網站、安卓、IOS)提供服務,這樣我們就要在邏輯層之上建設應用服務層,提供對客戶端的和對外的SOA服務介面。這樣又涉及到DTO、WebService、WCF和WebApi(Rest)等概念。但是最重要的是,SOA方式下,包括前面的MQ方式下,事務一致性無法得到保障的,必須採用一定的機制例如事務補償機制來確保事務的最終一致性。各個業務板塊所在的伺服器,在不同時段的壓力也不同,為了儘量做到伺服器集群內各伺服器的壓力平攤, 還需要提供更好的機制,記錄下每個伺服器的壓力、資源情況、連接數等等,以便將新的請求轉向到壓力最小的伺服器上。

 

七、第七階段

  業務繼續發展,就是CDN,再往下就是搭建幾個中心,將系統部署在各個中心,各地用戶訪問距離他最近的中心,中心間數據保持同步。

八、第八階段

  上面講了應用系統方面比較多,數據方面也要做許多工作。上面已經介紹了分庫分表方式。應用系統做大了,勢必有許多的數據資源,尤其是現在大數據這個名詞非常火爆的情況下,數據分析和處理是一個系統必須要做的事情。這樣做的好處是,將數據的查詢、分析等獨立出來,不影響正式運行中的系統,另外是通過分析挖掘確實能得到許多意想不到的價值。

  這時,主要的工作是搭建數據倉庫,然後進行後續的分析和處理。使用ETL/ELT將數據定期從正式環境中導入到數據倉庫中,按照不同的主題搭建一個個的數據集市。對於數據量比較小的系統,可以使用關係資料庫+多維資料庫的方式;對於大型系統,就要使用按列存儲、並行資料庫等方式了。對於數據的分析可以以報表、KPI、儀錶盤駕駛艙等方式提供上層領導決策,也可以使用數據挖掘、機器學習和訓練等方式實現價值發現、風險控制等。

 

九、第九階段

  一般情況下,企業是沒有那麼大的財力和人員去做上述內容的,因此使用雲成為企業的一個選擇。無論是Azure、阿裡雲、亞馬遜等都會提供一個個的服務。我們就以阿裡雲為例,ECS提供虛擬伺服器、SLB提供負載均衡、RDS提供資料庫服務、OSS提供存儲服務、DRDS是分散式數據服務、ODSP(現在改名叫MaxCompute)提供大數據的計算服務、RocketMQ提供MQ、OCS提供分散式緩存服務、以及CDN、OTS、ADS等等就不一一列舉了。

  現在還有Docker這個利器,無論在企業還是雲中都可以使用,我們在自己內部使用的Redis、Memcached、RabbitMQ、Solr等都部署在Docker中,確實比較方便。


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

-Advertisement-
Play Games
更多相關文章
  • 如果你是一個人在自學前端開發,或者是對前端開發有比較濃厚的興趣正想踏入前端領域,只要你在前端自學路上遇到了自己無法解決的技術難題,那麼儘管將你的疑惑交給我的小伙伴兒們吧,我們都是一群在前端自學路上摸爬滾打的有志青年,希望你可以來和我們共同交流。同時也希望你能獻出自己的一份力,幫助我的小伙伴兒們解決他 ...
  • 原型與原型鏈 javascript 創建對象 類與構造函數是大多數編程語言所擁有的,而借鑒了 C 與 JAVA 的 javascript 也是有類和構造函數的,不過 javascript 的實現不太一樣。 上面的例子中, 就是構造函數, 就是它的實例,但是它對共用性不太好,所以有了原型模式。 原型模 ...
  • 這兩天接觸到一個很有意思的 CSS 屬性 -- box-decoration-break。下麵就一起去一探究竟。 因為 MDN 上關於這個屬性,沒有中文文檔,所以一直在想一個合理貼切的中文翻譯。直譯一下: box -- 盒,可以理解為元素盒模型 decoration -- 裝飾,理解為元素樣式 br ...
  • [TOC] 裝飾器進階 通過上一篇已經知道, 如果還有概念還不理解的請返回裝飾器入門 "裝飾器入門" 裝飾器 實際也是一種函數, 他是 python語言的重要組成部分, 在實際開發中應用也相當廣泛. 正如我們所知, 前面所看到的被裝飾的函數都是最簡單函數格式, 這裡所說的簡單, 是指 ,`或者函數沒 ...
  • http://note.youdao.com/noteshare?id=42fc159d62b041e91c9e60822694db9f&sub=6D019045DECF4CAE8ABF5631C2798DCB ...
  • 1、架構 RocketMQ的master broker與master broker沒有任何消息通訊,nameserver之間也同樣沒有消息通信 MQ歷史 由數據結構隊列發展而來 MQ使用場景 非同步處理 解耦 削峰填谷 數據同步 2、隊列 rocketMQ一個主題(topic)包含多個隊列 3、使用 ...
  • 一直都想擁有一個屬於自己的技術博客,今天終於開通了,很激動。第一篇隨筆就分享一下自己今天剛學習和實踐的裝飾者設計模式。 一、設計模式到底是什麼東西,它有對應的物質嗎? 如果我們看不到物質,那麼一切的意識都是站不住腳的。那麼什麼是設計模式呢?它能映射到對應的物質嗎? 以前我剛開始接觸設計模式是在學習j ...
  • 一、業務開發與基礎開發的區別 - 劃分方式 一種將後臺開發細分的方式:前臺開發(業務)、中台開發(中間件、應用基礎服務、PAAS服務、IAAS服務)、後臺開發(運維開發)。一般前臺開發對應於業務開發,中台開發對應基礎開發,後臺開發對應運維。 - 規模 基礎開發的目標是解決業務的公共痛點,所以一般數據 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...