分散式架構的演進

来源:https://www.cnblogs.com/yumingxing/archive/2018/08/21/9511948.html
-Advertisement-
Play Games

一、什麼是分散式系統 分散式系統是建立在網路之上的系統。分散式系統背後是由一系列的電腦組成的,但用戶感知不到背後的邏輯,就像訪問單個電腦一樣。 特征: 最開始一臺伺服器上存儲著文件,數據,應用程式。隨著流量的增多,瓶頸出現,應用程式需要更快CPU,資料庫伺服器要更大記憶體(緩存)和硬碟,文件伺服器 ...


一、什麼是分散式系統

分散式系統是建立在網路之上的系統。分散式系統背後是由一系列的電腦組成的,但用戶感知不到背後的邏輯,就像訪問單個電腦一樣。

特征:

  1. 最開始一臺伺服器上存儲著文件,數據,應用程式。隨著流量的增多,瓶頸出現,應用程式需要更快CPU,資料庫伺服器要更大記憶體(緩存)和硬碟,文件伺服器要更大硬碟,便將三個功能分離到各自伺服器。

  2. 為了提高速度,將常用數據放到緩存中,緩存又分本地緩存和分散式緩存。

  3. 緩解伺服器壓力,採用集群,並通過負載均衡伺服器調度不同的應用伺服器。

  4. 除了緩存外仍有大量數據直接訪問資料庫伺服器,這時便採用讀寫分離。

  5. 使用CDN,反向代理加速網站響應,CDN可從距離自己最近的網路提供商機房獲取數據,如果反響代理中緩存著用戶請求的資源則直接返回給用戶。

  6. 分散式資料庫,是資料庫拆分的最後手段,按照不同業務拆分

  7. 業務越來越複雜採用分散式服務,傳統的SOA架構。

 

二、分散式架構的演進

1. 單體應用-All in one

特征:應用程式、資料庫、文件等所有的資源都在一臺伺服器上。

缺陷:發現隨著系統訪問量的再度增加,webserver機器的壓力在高峰期會上升到比較高,這個時候開始考慮增加一臺webserver。

 

 2. 應用服務和數據服務分離

特征:應用程式、資料庫、文件分別部署在獨立的資源上。

 

 

3. 使用緩存改善性能

特征:資料庫中訪問較集中的一小部分數據存儲在緩存伺服器中,減少資料庫的訪問次數,降低資料庫的訪問壓力。

 

 4. 使用應用伺服器集群

特征:通過Nginx的反向代理,通過負載均衡的調度,可以在一定程度上解決伺服器處理能力的瓶頸;

負載均衡的策略有:

   輪詢:每一次來自網路的請求輪流分配給內部中的伺服器,從1至N然後重新開始。此種均衡演算法適合於伺服器組中的所有伺服器都有相同的軟硬體配置並且平均服務請求相對均衡的情況。實現簡單,但存在伺服器的處理能力不同的情況;

   權重:根據伺服器的不同處理能力,給每個伺服器分配不同的權值,使其能夠接受相應權值數的服務請求。

例如:伺服器A的權值被設計   成1,B的權值是3,C的權值是6,則伺服器A、B、C將分別接受到10%、30%、60%的服務請求。

此種均衡演算法能確保高性能的伺服器得到更多的使用率,避免低性能的伺服器負載過重。考慮了伺服器處理能力的不足;

 

5. 資料庫讀寫分離

特征:資料庫讀寫分離。

6. 反向代理CDN加速

特征:採用CDN和反向代理加快系統的訪問速度。

7. 分散式文件系統和分散式資料庫

特征:資料庫採用分散式資料庫,文件系統採用分散式文件系統,加上遠程分散式緩存。

資料庫是系統資料庫拆分的最後方法,只有在單表數據規模非常龐大的時候才使用,更常用的資料庫拆分手段是業務分庫,將不同的業務資料庫部署在不同的物理伺服器上。

 

8. 使用Nosql和搜索引擎

特征:隨著業務越來越複雜,對數據存儲和檢索的需求也越來越複雜,系統需要採用一些非關係型資料庫如NoSQL和分資料庫查詢技術如搜索引擎。

9. 業務拆分

特征:系統上按照業務進行拆分改造,應用伺服器按照業務區分進行分別部署。

為了應對日益複雜的業務場景,通常使用分而治之的手段將整個系統業務分成不同的產品線,應用之間通過超鏈接建立關係,也可以通過消息隊列進行數據分發,

當然更多的還是通過訪問同一個數據存儲系統來構成一個關聯的完整系統。

10. 分散式服務SOA

特征:公共的應用模塊被提取出來,部署在分散式伺服器上供應用伺服器調用。

 

三、分散式存在的問題及微服務的引出

(1) 當服務越來越多時,服務URL配置管理變得非常困難,F5硬體負載均衡器的單點壓力也越來越大。
(2) 當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關係。
(3) 接著,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什麼時候該加機器?
(4) 服務多了,溝通成本也開始上升,調某個服務失敗該找誰?服務的參數都有什麼約定? 
(5) 一個服務有多個業務消費者,如何確保服務質量?
(6) 隨著服務的不停升級,總有些意想不到的事發生,比如cache寫錯了導致記憶體溢出,故障不可避免,每次核心服務一掛,影響一大片,人心慌慌,如何控制故障的影響面?服務是否可以功能降級?或者資源劣化? 

由於服務越來越多ESB服務匯流排維護起來越來越麻煩,微服務便由此發展而來!

由於業務間的邏輯越來越複雜,我們就不把這些業務全部雜糅在一起,每個業務都分開來做,這就是微服務。

 


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

-Advertisement-
Play Games
更多相關文章
  • 1:載入DOM在JavaScript中使用window.onload事件作為窗體載入事件(它在頁面所有數據載入完成之後才會執行)在jQuery裡面中使用 $(document).ready(function()) 作為窗體載入事件(在DOM載入完成之後就會執行)2:事件綁定 在文檔載入完成後,可以使 ...
  • 不多說,直接開始吧 // ES6之前常用寫法 for(var i = 0;i<10;i++){ /閉包寫法 (function(j){ var a = document.createElement("div"); a.innerHTML = j + " "; a.addEventListener(" ...
  • IE瀏覽器對於同一個URL只返回相同結果。因為,在預設情況下,IE會緩存ajax的請求結果。對於同一個URL地址,在緩存過期之前,只有第一次請求會真正發送到服務端。大多數情況下,我們使用ajax是希望實現局部刷新的,所以這就牽扯到一個改進的問題。 如果想每次都獲取到最新數據,我們只需保證每次傳入的U ...
  • 在微信開發中,寫過的一個簡單的音樂播放組件,記錄下。 music 音樂播放組件。 屬性 代碼 properties: { // 音樂路徑 music: { type: String, value: '', observer: function (newVal) { this._initMusic(n ...
  • this其實是一個Html 元素。 $this 只是個變數名,加$是為說明其是個jquery對象。 而$(this)是個轉換,將this表示的dom對象轉為jquery對象,這樣就可以使用jquery提供的方法操作。 先來看看JQuery中的 $() 這個符號,實際上這個符號在JQuery中相當於J ...
  • 此文是我的出版書籍[《React Native 精解與實戰》](http://rn.parryqiu.com/)連載分享,此書由機械工業出版社出版,書中詳解了 React Native 框架底層原理、React Native 組件佈局、組件與 API 的介紹與代碼實戰,以及 React Native... ...
  • Element.getBoundingClientRect()返回元素的大小及相對於視窗的位置 語法: rectObject=object.getBoundingClientRect(); 返回值是一個DOMRect對象,即DOMRect={x:scrollLeft,y:scrollY,width: ...
  • 開發環境: 安裝JDK8 安裝STS http://spring.io/tools/sts/ 安裝MySql 伺服器 https://www.mysql.com/downloads/ 客戶端 Navicat Premium 12 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...