《架構(gòu)即未來》&《架構(gòu)真經(jīng)》讀書筆記

寫在前面

時(shí)節(jié)如流,轉(zhuǎn)瞬間2018已經(jīng)過去,之前太忙于奔跑,一直說的讀書筆記整理,也擱置了4個(gè)多月。回顧這一年給我驚喜很多的書有很多,后面會專門整理下。計(jì)劃從這兩本架構(gòu)相關(guān)的書開始,驚喜的其實(shí)并不是書中有什么高深的套路,而是一種思維的沖擊,用DD大神的話總結(jié)就是

《架構(gòu)即未來》&《架構(gòu)真經(jīng)》 其實(shí)就是道與術(shù)的較量,道看似淺顯卻很高深,術(shù)看似實(shí)用卻受限于道。

架構(gòu)之道

架構(gòu)之道在于人

可擴(kuò)展性的關(guān)鍵是人

  • 人增加越多,每個(gè)成員的單位溝通和協(xié)調(diào)成本就越大。尤其個(gè)性解放的年代,每個(gè)小伙伴的性情各異,成長背景,工作經(jīng)歷都不盡相同,所以導(dǎo)致成員間的性格差別,做事風(fēng)格迥異,要大家統(tǒng)一遵守一個(gè)規(guī)則,顯得相對困難,所以耗費(fèi)在溝通和協(xié)調(diào)的成本不斷變大。
  • 合適的人,在合適的時(shí)間,做合適的事,都是一種美好的設(shè)想。所以招人時(shí)候,偏向于招味道相近的人。這樣的話期盼溝通成本,理解成本和默契程度更高,所以才會有些通用的評價(jià)人標(biāo)準(zhǔn),聰明要性皮實(shí)等。

組織的重要性

人是系統(tǒng)擴(kuò)展中最重要的因素,那么如何把人組織起來完成工作也就同樣重要。

  • 團(tuán)隊(duì)規(guī)模 ,過大過小都會出問題。
    • 團(tuán)隊(duì)過小 成員會過度勞累,陷入加班循環(huán) (比如少于6人)
    • 團(tuán)隊(duì)過大 溝通不暢,上產(chǎn)效率低下,士氣低落(比如多于15人)

規(guī)模過大團(tuán)隊(duì)生產(chǎn)率低下的原因:兩個(gè)極端,因?yàn)楦呒壒こ處煕]有足夠精力指導(dǎo)導(dǎo)致新人上手慢,反過來如果高級工程師花費(fèi)大量時(shí)間指導(dǎo)新人,那么會導(dǎo)致老人效率低下。

  • 團(tuán)隊(duì)分工,警惕情感型沖突
    分工代表責(zé)任劃分,一旦職責(zé)劃分不清,就會出現(xiàn)情感型沖突,比如這個(gè)需求該誰做,這塊問題該誰負(fù)責(zé)。而不是認(rèn)知型沖突,比如這個(gè)問題該怎么做。

可擴(kuò)展性和可用性失敗的共同原因是責(zé)任不清。

  • 團(tuán)隊(duì)結(jié)構(gòu)
    • 職能型組織:按照主要目的或職能設(shè)置部門
      • 優(yōu)勢:職責(zé)劃分清楚,容易分工,便于專注
      • 缺點(diǎn):跨部門溝通 出奇難
    • 矩陣型組織:引入多種職能角色在團(tuán)隊(duì)中
      • 優(yōu)勢:專人解決溝通問題,分而治之
      • 缺點(diǎn):個(gè)人精力分散,匯報(bào)多人,成員壓力大
    • 敏捷型組織:自我管制,自我組織。
      • 優(yōu)勢:提升團(tuán)隊(duì)的創(chuàng)造力
      • 缺點(diǎn):閉環(huán)的成本高

最好的架構(gòu)、需求和設(shè)計(jì)源于自組織的團(tuán)隊(duì)

  • 團(tuán)隊(duì)管理
    • 團(tuán)隊(duì)管理者 應(yīng)該以人為本
      • 以己為本 把員工當(dāng)成向上爬的梯子,踩著他們往上走
      • 以人為本 為所有一流員工建立好向上爬的梯子
    • 團(tuán)隊(duì)建設(shè)
      • 建設(shè)團(tuán)隊(duì) (類比球隊(duì)) 不斷尋找負(fù)擔(dān)的起的最好的人才
      • 優(yōu)化團(tuán)隊(duì) (類比花園)
        • 播種 增加新的,更好的人才
        • 施肥 培養(yǎng)和發(fā)展要保留的人才
        • 除草 盡早淘汰表現(xiàn)差的人,就能越快找到合適的替代者,讓團(tuán)隊(duì)向前發(fā)展

架構(gòu)之術(shù)

大道至簡

避免過度設(shè)計(jì)

  • 如何界定過度:設(shè)計(jì)是否淺顯易懂,是否讓其他同學(xué)可以快速理解
  • 表現(xiàn)為把一件事做的過于復(fù)雜和以復(fù)雜的方式去完成一個(gè)任務(wù)

在設(shè)計(jì)中要警惕復(fù)雜的解決方案

在這一塊兒的感觸還是比較深的,訂單導(dǎo)出的早期跑的比較快,沒有清楚自己的定位復(fù)用底層詳情能力,而開始瘋狂造輪子,為了獲取一個(gè)字段而專門設(shè)計(jì)了一個(gè)client,然后再設(shè)計(jì)一個(gè)組件來專門做這兩個(gè)數(shù)據(jù)聚合,由于都是并發(fā)取,發(fā)現(xiàn)新增的一個(gè)字段會導(dǎo)致老的導(dǎo)出出問題,用這種非常復(fù)雜的設(shè)計(jì)去獲取一個(gè)字段。而換個(gè)角度,詳情把字段能力補(bǔ)齊,而導(dǎo)出復(fù)用能力,會來的更加方便,維護(hù)起來架構(gòu)也異常簡單,過度設(shè)計(jì)的成本很高。

方案中帶有擴(kuò)展DID

設(shè)計(jì)方案時(shí)候,要想的遠(yuǎn)些,比如應(yīng)對是現(xiàn)有流量的10倍流量時(shí)候,這套設(shè)計(jì)是否會出現(xiàn)重大問題,而真正部署的時(shí)候如果是無狀態(tài)的可以動態(tài)擴(kuò)展的最好,比如核心應(yīng)用最少要預(yù)留五倍容量。

  • Design 設(shè)計(jì)應(yīng)對20-無限容量的挑戰(zhàn)
  • Implement 實(shí)施3-20倍容量
  • Deploy 部署1.5-3倍容量

三次簡化方案

  • 簡化方案范圍 比如砍掉些不必要的功能,釋放更多資源投入到更有價(jià)值的事情上
  • 簡化方案設(shè)計(jì) 易于理解、低成本、高效益和可擴(kuò)展的方式來完成工作
  • 簡化方案實(shí)施 最簡單的實(shí)施是可擴(kuò)展的衡量標(biāo)準(zhǔn)

帕累托原則: 收益的80%來自于20%的工作

分而治之

AKF擴(kuò)展立方體

這里重點(diǎn)介紹下AKF擴(kuò)展立方體,受益匪淺。之前組內(nèi)分享了下訂單搜索冷熱數(shù)據(jù)分離的分片維度及依據(jù),這個(gè)訂單搜索的AKF架構(gòu)演進(jìn)之路,后面會專門整理出來。


AKF擴(kuò)展立方體
  • X軸: 關(guān)注水平的數(shù)據(jù)和服務(wù)克隆,比如主備集群,數(shù)據(jù)完全一樣復(fù)制。克隆多個(gè)系統(tǒng)(加機(jī)器)負(fù)載均衡分配請求

    • 優(yōu)點(diǎn):成本最低,實(shí)施簡單
    • 缺點(diǎn):當(dāng)個(gè)產(chǎn)品過大時(shí),服務(wù)響應(yīng)變慢
    • 場景:發(fā)展初期,業(yè)務(wù)復(fù)雜度低,需要增加系統(tǒng)容量
  • Y軸: 關(guān)注應(yīng)用中職責(zé)的劃分,比如數(shù)據(jù)業(yè)務(wù)維度拆分。比如交易庫,商品庫,會員庫拆分。

    • 優(yōu)點(diǎn):故障隔離,提高響應(yīng)時(shí)間,更聚焦
    • 缺點(diǎn):成本相對較高
    • 場景:業(yè)務(wù)復(fù)雜,數(shù)據(jù)量大,代碼耦合度高,團(tuán)隊(duì)規(guī)模大
  • Z軸: 關(guān)注服務(wù)和數(shù)據(jù)的優(yōu)先級劃分,數(shù)據(jù)用戶維度拆分。比如上面按用戶維度買賣家切分 數(shù)據(jù)分片

    • 優(yōu)點(diǎn):降低故障風(fēng)險(xiǎn),影響范圍可控,可以帶來更大的擴(kuò)展性
    • 缺點(diǎn):成本最高
    • 場景:用戶指數(shù)級快速增長

水平擴(kuò)展

  • 向上擴(kuò)展 購買更大的軟件而實(shí)現(xiàn)的擴(kuò)展
  • 向外擴(kuò)展 通過復(fù)制或拆分服務(wù)或數(shù)據(jù)庫而分散事務(wù)負(fù)載
  • 異地多活 災(zāi)備
配置 網(wǎng)絡(luò) 服務(wù)器 數(shù)據(jù)庫 存儲 節(jié)點(diǎn)互連 總成本
單數(shù)據(jù)中心 100% 100% 100% 100% 0 100%
冷熱雙數(shù)據(jù)中心 200% 200% 200% 200% 1 200%
雙活雙數(shù)據(jù)中心 200% 200% 200% 200% 1 200%
三活三數(shù)據(jù)中心 150% 150% 150% 200% 3 ~166%

先利其器

適當(dāng)使用數(shù)據(jù)庫

  • 關(guān)系型數(shù)據(jù)庫
    • 適用 當(dāng)需要ACID屬性來保證數(shù)據(jù)之間的關(guān)系和一致性時(shí)
    • 優(yōu)勢 提供了高度的事務(wù)完整性,支持sql,可用于發(fā)雜查詢
    • 缺點(diǎn) 難以擴(kuò)展 成本高 海量數(shù)據(jù)效率低
  • 非關(guān)系型數(shù)據(jù)庫
    • 適用 不需要關(guān)聯(lián)其他數(shù)據(jù),也不需要事務(wù)完整性
    • 優(yōu)勢 無需sql層解析,讀寫性能快,存儲格式多樣
    • 缺點(diǎn) 無事務(wù)處理

馬斯諾錘子:當(dāng)你只有一個(gè)錘子時(shí),任何東西看起來都像個(gè)釘子

前車之鑒

失敗乃成功之母

抓住每個(gè)機(jī)會,尤其是失敗的機(jī)會,學(xué)習(xí)經(jīng)驗(yàn)并吸取教訓(xùn),不斷的從錯誤和成功中學(xué)習(xí)。
最好的經(jīng)驗(yàn)來自于失敗的錯誤,而不是成功。

之前訂單搜索和訂單詳情都有兩個(gè)經(jīng)典設(shè)計(jì)失敗案例,一直說要整理下,還沒有整理出來,看到這段話時(shí)候很觸動。兩次設(shè)計(jì)失敗都是為了追求通用性,復(fù)用性,所以將不同功能集于一身,成為一個(gè)萬能接口,導(dǎo)致功能支持起來后期比較吃力。舉個(gè)例子訂單搜索支持通用搜索(非訂單搜索),而早期入?yún)⑹前从唵嗡阉骶S度設(shè)計(jì),所以導(dǎo)致通用個(gè)搜索入?yún)⑻貏e不友好。早期訂單詳情支持實(shí)時(shí)+非實(shí)時(shí)一起,而發(fā)現(xiàn)實(shí)時(shí)的可返回字段遠(yuǎn)遠(yuǎn)少于非實(shí)時(shí)字段,實(shí)時(shí)非實(shí)時(shí)對應(yīng)支持的擴(kuò)展組件也不盡相同,不得不重構(gòu)抽離。

有備無患

用“泳道”隔離故障

  • 隔離的好處 不贅述
  • 隔離的原則
    • 泳道不共享
    • 泳道之間不進(jìn)行同步調(diào)用
    • 異步調(diào)用設(shè)置超時(shí)和開關(guān)控制
    • 限制泳道間異步調(diào)用

避免系統(tǒng)串聯(lián)

這個(gè)比較常見的雪崩源頭都是系統(tǒng)串聯(lián),其中一環(huán)發(fā)生問題,不斷導(dǎo)致上游出問題,而上游顯得很被動,串聯(lián)組件受多重失敗乘法效應(yīng)的影響。減少以串聯(lián)形式連接的組件數(shù)量。

啟用和禁用功能

限流降級的重要性,最大程度的保證應(yīng)用不被其他應(yīng)用拖垮。核心依賴的跑不了。

超然物外

力求無狀態(tài)

有狀態(tài)會限制可擴(kuò)展性,降低可用性并增加成本

異步通信

盡可能異步通信

盡可能優(yōu)先考慮異步通信而不是同步通信,異步通信可以削峰解耦,極大程度的避免耦合。同時(shí)同步調(diào)用使得整個(gè)程序停下來等待響應(yīng),它捆綁的所有服務(wù)和層,進(jìn)而導(dǎo)致連鎖性延遲或故障。

思考數(shù)據(jù)價(jià)值

海量訂單下的數(shù)據(jù)價(jià)值顯得格外重要,一些無用的垃圾信息或者不重要信息占據(jù)昂貴的存儲資源上,同時(shí)需要提供這種久遠(yuǎn)歷史的查詢,對整個(gè)系統(tǒng)的意義顯得格外低下,之前超過6個(gè)月的物流詳細(xì)信息進(jìn)行了刪除并引導(dǎo)到對應(yīng)物流公司網(wǎng)址查,后來據(jù)說要保留下來以提供查詢。還有就是6年前訂單也要跟現(xiàn)有訂單一起查,體會不到這個(gè)看似無比強(qiáng)大的能力背后帶來的價(jià)值和整個(gè)系統(tǒng)架構(gòu)為了實(shí)現(xiàn)該功能所付出的代價(jià),也許站的角度不同,不被感知。

畫蛇添足

避免寫入后立即驗(yàn)證剛寫入的數(shù)據(jù)

比較典型的場景是消息推送后反查,系統(tǒng)發(fā)送消息比如通知該訂單已經(jīng)支付,然后馬上過來再查下確認(rèn)下是否真的變成已支付。這種對實(shí)時(shí)性要求很高,只能引導(dǎo)去查實(shí)時(shí)數(shù)據(jù)庫,造成很大浪費(fèi),理論上消息體中的信息就可以直接拿到,所見即所信,當(dāng)然有的說消息推送的只是部分信息,需要來查全信息,那這種更傾向于推送的時(shí)候把信息退全,避免被動即時(shí)拉取。

意猶未盡

梯級存儲策略

將存儲成本與數(shù)據(jù)價(jià)值匹配,包括刪除價(jià)值低于存儲成本的數(shù)據(jù),并非所有的數(shù)據(jù)對業(yè)務(wù)都有相似的價(jià)值,事實(shí)上,隨著時(shí)間的推移,數(shù)據(jù)的價(jià)值經(jīng)常下降。因此不應(yīng)該用單一的存儲解決方案以同樣的成本存儲所有的數(shù)據(jù)。

RFM價(jià)值 Recency 指問題中數(shù)據(jù)多久前被訪問過 Frequency 數(shù)據(jù)多久被訪問一次 Monetization 數(shù)據(jù)的業(yè)務(wù)價(jià)值

分類處理不同負(fù)載

通過分區(qū)和故障隔離,處理獨(dú)特的工作負(fù)載,以最大限度的提高整體可用性、可擴(kuò)展性和成本收益

完善監(jiān)控

把必須監(jiān)控應(yīng)用作為一條架構(gòu)原則,看看整體監(jiān)控策略確保可以回答

  • 有問題嗎?
  • 問題在哪里?
  • 什么問題?

附上完整思維導(dǎo)圖


架構(gòu)即未來.png
架構(gòu)真經(jīng).png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容