1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        做架構(gòu)的四個(gè)思路

        共 2991字,需瀏覽 6分鐘

         ·

        2021-04-24 00:54

        這里是Z哥的個(gè)人公眾號(hào)

        每周五11:45 按時(shí)送達(dá)

        當(dāng)然了,也會(huì)時(shí)不時(shí)加個(gè)餐~

        我的第「188」篇原創(chuàng)敬上



        大家好,我是Z哥。

        很多在一線做coding工作多年的程序員朋友好像對「架構(gòu)」有著一股特殊的情感。

        一方面是自己長期在一線的各種項(xiàng)目中coding,好像除了業(yè)務(wù)代碼以外,「架構(gòu)」就是體現(xiàn)在項(xiàng)目中用到的一些框架。而且每個(gè)項(xiàng)目里用到的框架好像還都差不多,都是spring、redis什么的。覺得做架構(gòu)并不是什么難事。

        另一方面是,看著身邊的那些架構(gòu)師們拿著比自己高得多的薪水,而且講起架構(gòu)背后的“所以然”來又頭頭是道,覺得「架構(gòu)」又是一門看得到、近在眼前,但是自己又摸不著的能力。


        如果你對架構(gòu)感興趣,希望未來能有機(jī)會(huì)做架構(gòu),那么請繼續(xù)往下看。

        Z哥我有幸做過5年的架構(gòu)工作,其中4年是一線實(shí)操的主導(dǎo)者。所以來分享一些我在實(shí)戰(zhàn)中“多么痛的領(lǐng)悟”后的經(jīng)驗(yàn),和大家交流交流。


        首先,架構(gòu)肯定不是簡單的依樣畫葫蘆,別人在用redis,我也用redis,別人在用Nacos,我也用。

        會(huì)用一個(gè)工具其實(shí)并不難。如果只是會(huì)用的話,這背后最直接的一個(gè)問題就是,你沒有自己的思考過程,比如:

        • 為什么用這個(gè)工具來作為你架構(gòu)設(shè)計(jì)的一部分?

        • 它是否是滿足必要條件下的最優(yōu)解?

        • ……


        架構(gòu)思維的核心其實(shí)就是這個(gè)思考的過程,架構(gòu)設(shè)計(jì)的本質(zhì)是思考后的結(jié)果,具體的工具、技術(shù)只是這個(gè)結(jié)果的一部分而已。

        如果你沒有掌握合理的架構(gòu)思維,其實(shí)讓你做好幾年架構(gòu)工作也沒什么太大意義。因?yàn)楣ぞ咴俸?,也不代表你能造出好房子?/span>


        根據(jù)我這些年的經(jīng)驗(yàn),我在做架構(gòu)的過程中,提煉出了四個(gè)思路。我平時(shí)就是通過這些思路來指導(dǎo)我的思考方向的,如果你也有什么好的思路,歡迎留言與我和大家一起分享。


        /01  架構(gòu)是不斷演進(jìn)的/

        不要老想著一步到位,哪怕不考慮成本問題,也是不可能一步到位的,除非你能預(yù)料到眼前這個(gè)項(xiàng)目在未來的發(fā)展周期,直至其死亡。很顯然,這是不可能的。(有這個(gè)能力用來炒股不香么~)

        在我看來,一個(gè)系統(tǒng)架構(gòu)要具備良好的演進(jìn)能力,需要做到兩點(diǎn)。

        第一點(diǎn),就是本身設(shè)計(jì)上的「可擴(kuò)展性」。這個(gè)詞看起來很抽象,其實(shí)落地的時(shí)候你只要記住一句話:“鏈接”處的設(shè)計(jì)決定擴(kuò)展性。

        而一般來說,我們軟件里涉及到“鏈接”的地方主要就2個(gè)。一個(gè)是外部鏈接(系統(tǒng)與系統(tǒng)之間),一個(gè)是內(nèi)部鏈接(系統(tǒng)內(nèi)的模塊與模塊之間)。前者主要是通過網(wǎng)絡(luò)來進(jìn)行連接,所以通信協(xié)議的選擇上需要盡可能的普適、通用,這樣才能更有利于后續(xù)的迭代演進(jìn)。而后者主要是代碼層面的鏈接,在這類鏈接點(diǎn)上盡可能的使用Interface而不是具體的Class。


        除了必要的提高擴(kuò)展性的工作之外,特別重要卻又容易被忽略的一點(diǎn)就是「可觀測性」。

        只有當(dāng)一個(gè)架構(gòu)的關(guān)鍵指標(biāo)可以被觀測,你才能更好的把控演進(jìn)的方向,而不是拍腦袋決定。并且在每一次迭代完成后,通過觀測系統(tǒng)可以判斷這次迭代的效果是否符合預(yù)期。

        常見的屬于“觀測系統(tǒng)”的工作是,單元測試、自動(dòng)化測試、監(jiān)控系統(tǒng)、代碼檢測工具等等。


        /02 「分」是為了更好的治理/

        在分布式系統(tǒng)中,涉及到「分」的概念有很多,「橫向拆分」、「縱向拆分」、「一主多從」、「雙主多從」、「多主多從」。每一種概念你都能在網(wǎng)上輕易地搜到解釋。

        但是所謂的「分治」不是簡單的將系統(tǒng)隨便拆分一下,還要考慮拆分之后的治理成本。所以,你得明白當(dāng)前面臨的問題特點(diǎn)是什么,基于這個(gè)特點(diǎn)去選擇合適的拆分方案,而不是上來就懟一個(gè)多主多從,最好的方案不一定最適合你。


        治理成本中除了直接的維護(hù)成本外,還有一個(gè)容易被忽略的隱性成本就是「合」的成本。

        一個(gè)大系統(tǒng)內(nèi)的任何數(shù)據(jù)、子系統(tǒng)都不是孤立存在的,否則他們就沒有存在的價(jià)值。因此,耦合或多或少都存在。所以,在「分」的時(shí)候同時(shí)要考慮好有哪些「合」的場景,針對這些場景做好預(yù)案。最常見的應(yīng)對方案是,多冗余一份數(shù)據(jù),確保最終一致性即可。

        我之前接觸過的一個(gè)典型的反面案例是,兩個(gè)子系統(tǒng)在架構(gòu)上是自治的,但是他們之間的耦合也不少,兩個(gè)系統(tǒng)中大量充斥著調(diào)用另一個(gè)子系統(tǒng)的Rpc請求,然后在自己系統(tǒng)內(nèi)進(jìn)行數(shù)據(jù)合并,并返回給上游。在這樣的架構(gòu)設(shè)計(jì)之下,這兩個(gè)子系統(tǒng)成了“命運(yùn)共同體”,基本上一邊出問題,另一邊也會(huì)出問題。

        所以,「分治」不僅有「分」還要考慮「治」。


        /03  讓系統(tǒng)不宕機(jī)/

        讓系統(tǒng)不宕機(jī)是做架構(gòu)要全力堅(jiān)守的底線。

        如果說做架構(gòu)是設(shè)計(jì)高樓大廈的話,那么再高大上的高樓,如果坍塌了啥也不是。所以,一定把底線守住。

        我見過太多剛開始做架構(gòu)的同學(xué),一股腦的追求表面上的高大上,卻將系統(tǒng)的高可用問題拋之腦后。

        關(guān)于高可用,這里就不浪費(fèi)篇幅寫了,因?yàn)閮?nèi)容太多了,我之前有專門寫過一個(gè)系列,共八篇文章,文末我會(huì)放上鏈接??梢韵瓤赐赀@篇再跳過去看。


        /04  用領(lǐng)域思維建模/

        每位程序員都知道什么叫「面向?qū)ο蟆?。但是很多人的開發(fā)方式其實(shí)是“偽面向?qū)ο蟆钡?,為什么這么說呢?因?yàn)槊嫦驅(qū)ο笞钪匾墓ぷ魇墙?,而他們卻是在建數(shù)據(jù)表,然后用大量面向過程的代碼編寫軟件。

        隨著最近幾年的DDD大火,領(lǐng)域思維逐漸被大家所了解,它就是一個(gè)可以非常棒地指導(dǎo)我們建模的思路。不但可以指導(dǎo)宏觀層面的模塊劃分,還可以指導(dǎo)具體的Class設(shè)計(jì)。

        為什么這么說呢?

        因?yàn)轭I(lǐng)域思維強(qiáng)調(diào)的是,將業(yè)務(wù)含義充分體現(xiàn)在模型中,建立所謂的「充血模型」。所以通過領(lǐng)域思維做的建模不單單有數(shù)據(jù)屬性,還有業(yè)務(wù)模型的行為以及約束等,任何具有業(yè)務(wù)含義的概念都要在代碼中體現(xiàn)。

        如此一來,架構(gòu)工作中的「分」的部分基本上直接給搞定了。剩下主要考慮「合」的問題以及具體的技術(shù)選型就好了。


        DDD的具體應(yīng)用就不展開說了,內(nèi)容太多,能寫一個(gè)系列文章。當(dāng)然也沒必要寫,因?yàn)檫@事已經(jīng)有人做得很棒了,直接看Vaughn Vernon的《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》就好。不管你是初學(xué)DDD還是想熟練運(yùn)用DDD,看這本書都是最適合的,沒有之一。


        如果你想進(jìn)一步深入DDD背后的思想原理,那么可以讀一下Eric Evans的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)——軟件核心復(fù)雜性應(yīng)對之道》。


        好了,總結(jié)一下。

        這篇呢,Z哥和你分享了我做架構(gòu)的四個(gè)思路。分別是,

        1. 架構(gòu)是不斷演進(jìn)的

        2. 「分」是為了更好的治理

        3. 讓系統(tǒng)不宕機(jī)

        4. 用領(lǐng)域思維建模


        不敢說這幾個(gè)思路一定能幫助你設(shè)計(jì)出多么牛逼的架構(gòu),但至少應(yīng)該是合格的。希望對你有所幫助。

        掌握了合理的思路后,做架構(gòu)這件,看起來簡單,做起來也簡單。


        推薦閱讀:



        原創(chuàng)不易,如果你覺得這篇文章還不錯(cuò),就「點(diǎn)贊」或者「在看」一下吧,鼓勵(lì)我的創(chuàng)作 :)


        也可以分享我下面的公眾號(hào)名片給有需要的朋友們。

        如果你有關(guān)于軟件架構(gòu)、分布式系統(tǒng)、產(chǎn)品、運(yùn)營的困惑

        可以試試點(diǎn)擊「閱讀原文

        瀏覽 23
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            色欲久久99国产精品久久久久久 | 婷婷婷五月综合伊人久久 | 肉性天堂| 日本护士喷潮毛片视频 | 日本在线一级 | 欧美三级网站在线 | 国产无码毛片 | 看全色黄大色大片免费软件 | 亚洲美女操逼视频 | 欧美日韩精品 |