我的20年觀察:分佈式架構的演進和未來發展

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4月25日,由InfoQ舉辦的ArchSummit全球架構師峯會正式開幕。在本次峯會上,阿里巴巴數字供應鏈資深技術專家黃浩分享了自己這些年對分佈式架構發展與變遷的觀察和思考。本文爲整理內容。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天分享的內容主要是三個方面:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一,大家在架構實踐中遇到的一些問題和挑戰"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二,個人對分佈式架構發展的一些思考"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第三,給大家的一些個人建議"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"什麼是架構"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,我們要理解什麼是架構。對架構這個詞,有很多不同層面的理解。從我個人來說,架構有兩個非常重要的部分:一是稱之爲結構,另外一個是是結構之間構成的協作模式。我們看到,架構中會用到很多一些術語,比如DDD等。第二是我們在實現這多種關係之間,它們怎麼相互合作。我們會看到,大家經常用的Pipe line方式,像流水線的方式,像SOA的方式,甚至像現在流行的事件驅動方式,還有一些在前端的Reactive響應式的方式,這些是架構的結構和協作模式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"架構的定義有時很廣泛。有時關於架構的談話,你會發現大家並不在一個維度上。實際上,在整個架構定義中,還有很多不同層面的定義。技術人員常說的架構,包括基礎架構,這更多描述的是IaaS這一層以及物理部署的架構的東西。同時,還有更大規模的一些資源調度、協作以及這方面的實踐。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"業務架構可能是大家在一個業務系統裏最常見的。一般來說,業務架構往往和產品架構中的相互關係比較大,但技術人員可能接觸比較少。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二是運用架構。即我實現一個業務、一個系統時,如何構造應用。我們絕大部分談論的架構師在工程層面都是應用架構的實踐,SOA、CS架構、分層架構等。同時,還有數據架構,這相對比較少見。我們知道有中心式的數據架構、分佈式的數據架構,比如大規模節點的調度。我們提到的數據中臺,如何去構建我們的數據架構。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,最常見的是作爲一個技術架構師去實現我們這樣的一個架構體系。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"架構實踐中的不足之處"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在談基礎架構的實踐時,我想我們單純去看架構實踐上的一些不足。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"缺乏很多好模式的的沉澱"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最近幾年,我們看到的架構模式,準確說來自15年前一本叫《企業架構模式》的書籍,比如分層架構、領域建模等,但實際上,經過這麼多年,我們在架構實踐領域並沒有多少很好的模式的沉澱。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"對架構的未來實踐缺乏深思"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其次,經過這麼多年的發展,我們看到在工程架構層面,我們不斷重複過往的一些前人的東西,不管是經驗也好,還是失敗也好。所以,未來的工程系統,我們的IT應用應該發展成什麼樣,其實在架構的實踐層面是缺少這些思考的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很多同學來參加 ArchSummit 大會時,希望獲得一些東西,但在實際應用中,我們往往變成簡單的複製。其實,每一個架構在面對不同業務場景和不同的工程問題時,它的差異蠻大。"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"概念混爲一談"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們談到了架構分類,但是很多時候,架構是一人多職。在討論或解決一些問題時,我們往往把應用架構、業務架構混爲一談,把應用架構和技術架構混爲一談,把應用架構和基礎架構混爲一談。我們發現,這也是我們架構模式很難沉澱的一個原因。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"業務場景變化給架構帶來的影響"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"簡單說一下,我對現在業務場景的一些個人思考:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一是"},{"type":"text","marks":[{"type":"strong"}],"text":"全球化"},{"type":"text","text":"。個人認爲,無論是《中歐全面投資協定》的簽署,還是疫情,我們可以看到中國的跨境出口,以及國際之間的貿易在變大,而不是在縮小。這帶來的最大一個變化是全球化。現在,有些公司在全球化上做得相當不錯了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"全球化會帶來包括多樣的一些市場環境,包括全球每個站點之間,它區域的一個封閉和差異,同時我們跨業務的這個規模逐漸在做到。對架構影響最大的是兩點:一是網絡的物理約束,這個物理約束來自於距離;二是來自於大家熟悉的網關。這些導致在全球化的多站點之間,信息很難及時互通或高效響應。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在面對全球化時,我們的架構應該有什麼樣的變化?我們的基礎架構和應用架構、數據架構之間應該是什麼樣的關聯?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此外,數據還會面臨一些合規問題。這不像過去,我們可以中心化的存儲到一個節點。我們每個環境,消費者的數據、企業的數據都必須留在本地。這樣情況下,我們的應用、企業結構之間、基礎架構之間怎麼樣去協作?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二是"},{"type":"text","marks":[{"type":"strong"}],"text":"本地化"},{"type":"text","text":"。現在,像社區團購這樣的業務場景在蓬勃發展,但這帶來一個很大變化。過去,互聯網發達時,所有用戶在每一個節點訪問上來,它都是一個節點,它的流量回到一個所謂的中心。我們把所有的互聯網當做一個整體,互聯網的架構其實是一箇中心化架構。簡言之,所有的流量,所有的數據都是在我們的互聯網中心機房處理的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但隨着本地化的發展,一些信息、一些數據和數據處理其實可以在本地完成,比如滴滴打車、周邊三公里的團購。那這種場景下,架構如何協作?我們是中心化處理,還是分佈式。在分佈式下,我們說局部的熱點,以及分佈式每個節點的數據,如何跨節點進行聯動?以及在每個站點裏如何做到高效及時性的反饋?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最重要的一點。我們知道在互聯網有一個很重要的數據思維叫BASE理論,其中一點是最終的數據一致性,高可用的簡單性。這兩點情況下,如果整個是分佈式站點情況下,如何做到數據的高保真?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"比如,我們去谷歌或百度搜索一個頁面,背後的內容資源可能有幾十億條,甚至上百億條,展現出來的是幾百條,這幾百條一定是那麼準確嗎?未必,我們可能會犧牲掉很多的數據一致性和準確性。但是在局部的一個本地化場景裏,我們每個局部的數據可能只有幾十條、幾百條。當用搜索或用各種方法展現這些數據時,如果不能做到數據高保真,就有可能出現信息的丟失。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"最近3年,架構演進的變化"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在,我們來看看最近3年,架構發生了哪些變化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一,比特幣的誕生,它帶來的一個最大好處是分佈式賬本技術,去中心化地實現了數據的一致性和數據可信性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以,如何實現這樣一個分佈式數據的一致性,這是一個很大的課題。阿里巴巴、螞蟻一直在做區塊鏈,我們的區塊鏈技術也只能做到幾百個節點。而比特幣相對簡單,更多涉及的是幣種的交易,如果放到一個更復雜的交易模型,如何做到數據一致性是很大的一個特性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二,我們絕大多數人是學Java的。Java在誕生時提出一個觀點“Write One,Run Everywhere“。但實際上每個同學可以問問自己,看看周邊的系統,我們到底有多少個應用?我們多少的代碼是可以做到這一點?原因是什麼?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原因是我們的技術體系,我們的應用一層一層進行了強耦合。我們很難做到我們的東西被遷移、被複制。那我們知道,在整個軟件領域,架構層面的複用是最高等級的複用,但實際上我們很難做到。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第三,全球化架構,整個非站點的依賴性。任何一個企業,想做多站點部署或全球化部署時,我們的應用、我們的上層、我們的業務架構、我們的東西全部是強感知的。我們很難做到,今天在一個地方,可以在另外一個地方去消掉底層基礎架構的差異,去模糊掉我整個網絡的一些物理約束的差異,最後面是容器化技術和網格計算能力,在最近幾年得到一個非常大的發展。這得益於一是雲計算服務商提供的東西,更得益於像K8s這樣一些容器化技術的廣泛應用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後一點是對等架構。對等架構是一個非常複雜的,即去掉了中心化,每個節點相對於其他節點都是對等的。中心化節點一個最大的好處是非常有利於信息的快速轉遞,比如我今天的分享,是通過中心化方式傳遞給每個聽衆。但沒有這樣中心化的節點,信息傳遞的成本就非常高。失去了中心節點的另外一個好處是,信息傳播的速度以及信息傳播的這個價值性的傳遞是非常高效的。比如,信息在一羣人中間傳遞時,它比中心化傳遞更快。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果說,思考整個架構發展背後最重要的東西是什麼?我覺得其實是理念。一個架構背後理念的東西決定了我們如何去思考架構,以及如何去定義、去設計我的架構。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"架構發展最重要的幾個點"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一是結構關係。分層結構是整個架構中非常重要的。但是,很多同學和一些架構師在理解分層結構時,理解錯了。很多人學過,在最早GEE時要有分層模式,比如有服務層、DL層、數據模型或數據域對象層,甚至還有代理層,這往往是一個非常簡單的分層,它用到了分層結構的理念,但我們很多同學盲目抄襲這樣一個結構。把本身可以很簡潔、很好的一些代碼寫的非常複雜,但實際上我們很多人真正在架構分層時,就失去了這個理解。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"比如現在有人談雲原生,有個重要公司叫Cloud Foundry,它成功的原因是屏蔽了底層基礎架構的差異,屏蔽了前面,它站在更高層面。它屏蔽了IaaS,屏蔽了雲公司、雲基礎服務商的差異,就像我們雲基礎服務商屏蔽了我們硬件上的差異一樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Cloud Foundry在PaaS這層屏蔽後,它其實就帶來很多的可能,那我們很多時候,我們如何去看待分層架構,我們每一層東西對下一層之間的依賴和深耦合分別是什麼?這個思想是一個架構師必須深刻理解的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二是對等結構,對等結構是非常複雜,但也是非常理想的和重要的一個這樣的結構。我們過去的很多東西,比如很多流量的瓶頸,我們很多的這種處理的瓶頸,我們都會用一箇中心化的方式。大家爲了解決中心化的瓶頸方式的時候,會採用一種叫做中心配置的模式。大家可能聽到過一個新概念叫軟負載,軟負載是什麼意思?我們知道所有一種負載均衡過去流量達到一個節點,分發到不同的這個下枝節點上,軟負載就算每一個節點自己來承擔這樣的一個負載,這其實是一個對等結構的一種轉化。但是軟負載裏面有一個最大的問題,它還是會依賴於一個叫中心配置,把所有的配置的信息去管理這些節點。真正理想的對的節點,當我們的節點變成一個五千,甚至上萬的節點時,這樣的一個節點之間的橫向調度,以及管理成本是非常高。所以說對等結構是一個非常好的,但是也是非常難的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此,我覺得每一個架構師在思考我們結構轉化時可以考慮這個。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後就是我們的計算模式,也是剛纔達到對等結構以下,那我們的並行結算,我們的協作這個是一個非常重要可以思考的方式,如何去調度?我們之前談到雲計算、雲原生,比如跨雲和多雲的結構,它對我們雲原生的挑戰,其次就是包括我們的雲邊一體。在談到本地化後,邊緣計算和雲計算如何結合,如何做到雲邊一體的協作。今天我們的雲邊是強感知的,準確來說叫端,並不叫邊,端是什麼?其實是一個交互的結點,它對整個的計算,它並不參與真正的計算,它更多的是我們跟外界之間交互和信息這種傳遞的結果。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說實話,今天的雲計算還屬於初級,每一個人在雲計算機房去購買一個東西的時候,他還是說他強感知,深圳的機房,上海的機房,什麼時候雲計算真的變成一塊雲,那我們的架構就會發生很大的變化,這樣的關於彈性架構,那我們說整個彈性架構的東西,就包括對等的結對調度,包括我們的柔性的橫向的適應,包括我們剛纔說的多結點,非中心化的一個協作計算,最後面是分層依賴的能夠實現我們低成本的橫向遷移,這些是整個彈性架構的一個發展情況。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"建議"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"許多用戶來參加ArchSummit,我們聽到每一位講師分享架構的一些實踐、一些經驗。我們如何去學習,我覺得有幾點可以分享給大家。我希望大家可以瞭解,每個架構背後需要解決的問題是什麼。我們可以討論,去強調我談到的協作和結構,它使用的架構模式是什麼?哪些模式是可以被抽象、被沉澱、被複用,最後是每一個分享者他在實踐過程中,遇到了什麼樣的問題,他是如何解決的,每一位分享者,他分享這些經驗時,其實它背後有哪些思考的不足和處理的不足,這些東西就是我們每一位聽衆在聽分享時可以收穫的。"},{"type":"text","marks":[{"type":"strong"}],"text":"我希望每一位架構師不僅僅是一個問題的解決者,也不僅僅是一個問題的分析者,而成爲一個優秀問題的定義者。"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章