<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    分布式架構(gòu)概述及設(shè)計(jì)

    共 3137字,需瀏覽 7分鐘

     ·

    2021-04-14 17:20

    點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

    優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

    76套java從入門到精通實(shí)戰(zhàn)課程分享

    引言

    隨著越來越多的人參與到互聯(lián)網(wǎng)的浪潮來,曾經(jīng)的單體應(yīng)用架構(gòu)越來越無法滿足需求,所以,分布式集群架構(gòu)出現(xiàn),也因此,分布式搭建開發(fā)成為了Web開發(fā)者必掌握的技能之一。那什么是分布式呢?怎么實(shí)現(xiàn)分布式以及怎么處理分布式帶來的問題呢?本系列文章就來源于對分布式各組件系統(tǒng)的學(xué)習(xí)總結(jié),包含但不限于Zookeeper、Dubbo、消息隊(duì)列(ActiveMQ、Kafka、RabbitMQ)、Nosql(Redis、MongoDB)、Niginx、分庫分表MyCat、Netty等內(nèi)容。作為跟大多數(shù)人一樣的學(xué)習(xí)使用者,而非布道者,個人理解難免會有偏差或是其它錯誤,希望各位讀者不吝指教。


    正文

    一、什么是分布式

    簡單的說,“分工協(xié)作,專人做專事”就是分布式的概念。就好比你是你們公司唯一的碼農(nóng),那么前后端都需要你自己來開發(fā)(單體架構(gòu)),但隨著業(yè)務(wù)的增長,你確實(shí)忙不過來了,老板給你招來了一個前端,那么你就只需要專注后端開發(fā)就行了(分布式)。但是軟件的分布式搭建遠(yuǎn)遠(yuǎn)不像現(xiàn)實(shí)例子中這么簡單,需要考慮和處理很多方面的問題,我們先了解以下幾個常見的概念:

    • 集群:你們公司業(yè)務(wù)增長的非常快,老板發(fā)現(xiàn)你一個后端忙不過來了,就又招了幾個后端開發(fā)來協(xié)助你,這就是后端集群;再往后,發(fā)現(xiàn)前端也忙不過來了,又配備幾個前端,就是前端集群。所以也不難看出,將應(yīng)用拆分后,你可以有針對性地?cái)U(kuò)展單個服務(wù),做成集群,這就是分布式的好處之一。

    • 節(jié)點(diǎn):這個也非常好理解,一個服務(wù)就是一個節(jié)點(diǎn),比如你就是后端集群中的一個節(jié)點(diǎn),而集群本身也可以看成是整個應(yīng)用的一個集群節(jié)點(diǎn)。

    • 副本:副本就是為服務(wù)和數(shù)據(jù)提供的冗余,保證高可用。

    • 中間件:為開發(fā)者提供便利,屏蔽復(fù)雜的底層的一類框架組件。如服務(wù)管理通信、序列化、負(fù)載均衡等組件。

    上圖就是一個簡單的分布式架構(gòu),但并不是所有的應(yīng)用一開始就要設(shè)計(jì)為分布式架構(gòu),因?yàn)橐婚_始業(yè)務(wù)量并不大,沒有必要耗費(fèi)大量的時(shí)間和成本去完成一個分布式架構(gòu),甚至有可能到最后都用不上,因此在設(shè)計(jì)時(shí)我們應(yīng)該遵循演進(jìn)原則,由簡入深。下面就來簡單分析一下分布式架構(gòu)的演進(jìn)過程。

    二、分布式架構(gòu)的演化過程

    單機(jī)版

    以商城為例,為了簡單說明,這里就只列出用戶、訂單、配送服務(wù)。

    如圖,大部分應(yīng)用最開始都是將應(yīng)用和數(shù)據(jù)庫放到一臺物理機(jī)上提供服務(wù),但隨著訪問量的提升,服務(wù)器負(fù)載越來越高,我們首先會優(yōu)化代碼、對機(jī)器做垂直擴(kuò)容(內(nèi)存、容量)等,但單臺機(jī)器的性能是存在上限的,且對單機(jī)擴(kuò)容的性價(jià)比會隨著性能的提升越來越低,那我們就會想到增加服務(wù)器。


    將應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器分離

    在一開始,我們可能只會增加一臺服務(wù)器,并將應(yīng)用和數(shù)據(jù)庫分離:


    搭建應(yīng)用服務(wù)器集群

    隨著訪問量的繼續(xù)增加,單臺應(yīng)用服務(wù)器也無法滿足需求了,我們就需要搭建應(yīng)用服務(wù)器集群來對外提供服務(wù)了

    但是,在搭建應(yīng)用服務(wù)器集群之后,問題就出現(xiàn)了,用戶在訪問時(shí),應(yīng)該到哪個服務(wù)器上去?如何平均服務(wù)器壓力?以及用戶的session如何維護(hù)(A首先訪問了1號應(yīng)用服務(wù)器并登陸,但下次請求可能是去到2號服務(wù)器,但這臺服務(wù)器上并沒有用戶的session信息)?

    我們可以在用戶層和應(yīng)用層之間加上一個負(fù)載均衡器來平衡服務(wù)器的負(fù)載,session可以采取同步的方式,或者增加單獨(dú)的session共享服務(wù)器。


    數(shù)據(jù)庫讀寫分離

    應(yīng)用層的問題暫時(shí)解決了,但是此時(shí)數(shù)據(jù)庫又頂不住了。那該如何做呢?只是簡單的增加數(shù)據(jù)庫的服務(wù)器拉提供存儲和訪問能力么?那肯定不行,這樣數(shù)據(jù)就不一致了。所以我們需要將數(shù)據(jù)庫分為讀庫和寫庫。查詢請求都到讀庫去,而寫入請求都到寫庫去。

    但這樣也存在幾個問題:

    • 數(shù)據(jù)如何同步以及同步延遲如何處理?

    • 應(yīng)用層數(shù)據(jù)源的選擇

    • 大數(shù)據(jù)查詢搜索,可以引入搜索引擎

    • 避免每次訪問直接到達(dá)數(shù)據(jù)庫,可以引入redis等緩存數(shù)據(jù)庫緩存熱點(diǎn)數(shù)據(jù)

    問題看似都解決了,但是每個數(shù)據(jù)庫都存儲的是同樣的數(shù)據(jù),隨著業(yè)務(wù)繼續(xù)擴(kuò)大, 我們就不得不考慮對數(shù)據(jù)庫做水平或垂直拆分:

    • 水平拆分:將同一個表中的數(shù)據(jù)拆分至多個數(shù)據(jù)庫中

    • 垂直拆分:將不同業(yè)務(wù)的數(shù)據(jù)放到不同的數(shù)據(jù)庫中

    應(yīng)用拆分

    業(yè)務(wù)繼續(xù)增長,數(shù)據(jù)庫達(dá)到瓶頸時(shí)可以繼續(xù)增加服務(wù)器解決,但是應(yīng)用層呢?也只是單純的增加服務(wù)器么?基于二八原則,其實(shí)大部分訪問量是集中在20%的功能上的,如果我們只是單純的增加服務(wù)器,那么無疑會浪費(fèi)掉許多的資源,所以我么會想到能不能針對這20%的應(yīng)用做擴(kuò)展呢?當(dāng)然是可以的,只不過我們需要先將應(yīng)用拆分為多個子系統(tǒng)(一般是根據(jù)業(yè)務(wù)):

    隨著應(yīng)用拆分隨之而來的問題是,公用的代碼如何處理?各服務(wù)之間如何通信?公用代碼我們不可能放到每個服務(wù)中去,而是應(yīng)該提出來對外提供服務(wù),同時(shí)服務(wù)之間的調(diào)用可以通過RPC或者HTTP方式來實(shí)現(xiàn)。


    演化至此,這樣的架構(gòu)就是一個成熟的分布式架構(gòu)了,但是,架構(gòu)還是會隨著業(yè)務(wù)和技術(shù)的提升不停地演化;而此時(shí)你有沒有發(fā)現(xiàn)這樣的一個架構(gòu)和馮諾伊曼結(jié)構(gòu)很像呢!輸入輸出設(shè)備對應(yīng)用戶和服務(wù)之間的輸入輸出,數(shù)據(jù)庫服務(wù)器就像是存儲設(shè)備,而整個應(yīng)用層就像是一個CPU(控制器、運(yùn)算器)。所以,分布式架構(gòu)可以簡單的理解為將多臺計(jì)算機(jī)組成的一臺超級計(jì)算機(jī)。


    三、分布式架構(gòu)的設(shè)計(jì)

    在設(shè)計(jì)分布式架構(gòu)時(shí),我們需要了解幾個基本的概念。

    • 主流架構(gòu)模型-SOA和微服務(wù)

    • CAP和BASE理論

    • DDD(領(lǐng)域驅(qū)動設(shè)計(jì))

    這些理論限于篇幅原因,這里就不展開詳述,讀者可自行查閱。下面主要來談?wù)劮植际郊軜?gòu)的高可用設(shè)計(jì)。


    分布式架構(gòu)的高可用設(shè)計(jì)

    在分布式架構(gòu)中,常常面臨的兩個矛盾的問題是一致性和高可用,這兩個是無法同時(shí)滿足的,那我們舍誰取誰呢?從用戶的角度分析,我們寧可獲取到舊數(shù)據(jù),也不愿意等半天都打不開應(yīng)用,所以常常是保證高可用,讓數(shù)據(jù)達(dá)到最終一致性,那么如何設(shè)計(jì)高可用的分布式架構(gòu)呢?主要從以下幾個方面:

    • 搭建服務(wù)集群,提高負(fù)載,避免單點(diǎn)故障。尤其是特別重要的服務(wù),如訪問量較高的服務(wù)和核心服務(wù)(一旦掛掉就會導(dǎo)致整個應(yīng)用不可用的服務(wù))。

    • 應(yīng)對災(zāi)難,搭建異地災(zāi)備,預(yù)防地區(qū)因發(fā)生地震、臺風(fēng)等自然災(zāi)害導(dǎo)致地區(qū)的集群服務(wù)器都不可用。

    • 接口限流以及服務(wù)降級。為防止過高的并發(fā)量造成服務(wù)器負(fù)載過高而出現(xiàn)故障,應(yīng)對接口限流,同時(shí),當(dāng)某個或多個服務(wù)出現(xiàn)故障時(shí),應(yīng)當(dāng)服務(wù)降級,避免拖累整個應(yīng)用。比如支付時(shí)因網(wǎng)絡(luò)故障等導(dǎo)致無法支付,但搜索商品和下單仍然可用。

    • 故障監(jiān)控報(bào)警。

    • 服務(wù)的可伸縮性,易于水平擴(kuò)張服務(wù)器數(shù)量。

    • 使用緩存降低數(shù)據(jù)庫壓力。

    • 使用CDN等加速靜態(tài)資源的訪問。

    高可用的分布式架構(gòu)需要考慮非常多的方面,針對不同的場景有不同的解決方案,而對于不同的公司而言也不需要一應(yīng)俱全,需要在實(shí)踐中多思考總結(jié),根據(jù)自己的業(yè)務(wù)情況來設(shè)計(jì)。


    總結(jié)

    本文從理論層面講述了分布式的基本概念、演化過程,以及設(shè)計(jì),從宏觀角度搞清楚分布式的起源以及分布式帶來的一系列問題,也就能明白各項(xiàng)技術(shù)出現(xiàn)的原因以及應(yīng)用的場景。

    ————————————————

    版權(quán)聲明:本文為CSDN博主「夜勿語」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

    原文鏈接:

    https://blog.csdn.net/l6108003/article/details/94835586





    鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

    ??????

    ??長按上方微信二維碼 2 秒





    感謝點(diǎn)贊支持下哈 

    瀏覽 66
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評論
    圖片
    表情
    推薦
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    丰满肥臀无码一区二区三区 | 日逼网站免费观看 | 91超日日日日 | 欧美黑人大鸡巴操逼视频 | 乱伦A区 乱伦影音 |