雲架構師的進階之路

原文連接html

 

架構的三個維度和六個層面

第一個是IT架構,其實就是計算,網絡,存儲。這是雲架構師的基本功,也是最傳統的雲架構師應該首先掌握的部分,良好設計的IT架構,能夠下降CAPEX和OPEX,減輕運維的負擔。數據中心,虛擬化,雲平臺,容器平臺都屬於IT架構的範疇。程序員

第二個是應用架構,隨着應用從傳統應用向互聯網應用轉型,僅僅搞定資源層面的彈性還不夠,經常會出現建立了大批機器,仍然撐不住高併發流量。於是基於微服務的互聯網架構,愈來愈成爲雲架構師所必需的技能。良好設計的應用架構,能夠實現快速迭代和高併發。數據庫,緩存,消息隊列等PaaS,以及基於SpringCloud和Dubbo的微服務框架,都屬於應用架構的範疇。面試

第三個是數據架構,數據成爲人工智能時代的核心資產,在作互聯網化轉型的同時,每每進行的也是數字化轉型,並有戰略的進行數據收集,這就須要雲架構師同時又大數據思惟。有意識的建設統一的數據平臺,並給予數據進行數字化運營。搜索引擎,Hadoop,Spark,人工智能都屬於數據架構的範疇算法

三個維度是從人的角度出發的,sql

 

若是從系統的角度出發,架構分六個層次。數據庫

第一個層次是基礎設施層,後端

  在數據中內心面,會有大量的機架,大量的服務器,並經過交換機和路由器將服務器鏈接起來,有的應用例如Oracle是須要部署在物理機上的。設計模式

  爲了管理的方便,在物理機之上會部署虛擬化,例如Vmware,能夠將對於物理機複雜的運維簡化爲虛擬機靈活的運維。緩存

    虛擬化採起的運維方式可能是由運維部門統一管理,當一個公司裏面部門很是多的時候,每每要引入良好的租戶管理,基於Quota和QoS的資源控制,基於VPC的網絡規劃等,實現從運維集中管理到租戶自助使用模式的轉換,託生於公有云的OpenStack在這方面作的是比較好的。服務器

  隨着應用架構愈來愈重要,對於標準化交付和彈性伸縮的需求愈來愈大,容器最爲軟件交付的集裝箱,能夠實現基於鏡像的跨環境遷移,Kubernetes是容器管理平臺的事實標準。

第二個層次是數據層,也即一個應用的中軍大營,

  若是是傳統應用,可能會使用Oracle,並使用大量的存儲過程,有大量的表聯合查詢,成本也每每比較高。

  可是對於高併發的互聯網應用,須要進行微服務的拆分,數據庫實例會比較多,使用開源的Mysql是常見的選擇,大量的存儲過程和聯合查詢每每會使得微服務沒法拆分,性能會比較差,於是須要放到應用層去作複雜的業務邏輯,數據庫表和索引的設計很是重要。

  當併發量比較大的時候,須要實現橫向擴展,就須要基於分佈式數據庫,也是須要基於單庫良好的表和索引設計。

  對於結構比較靈活的數據,可使用MongoDB數據庫,橫向擴展能力比較好。

  對於大量的聯合查詢需求,可使用ElasticSearch之類的搜索引擎來作,速度快,更加靈活。

第三個層次是中間件層,

  由於數據庫層每每須要保證數據的不丟失以及一些事務,於是併發性能不可能很是大,

    因此咱們常常說,數據庫是中軍大營,不能全部的請求都到這裏來,

    於是須要一層緩存層,用來攔截大部分的熱點請求。

  Memcached適合作簡單的key-value存儲,內存使用率比較高,並且因爲是多核處理,對於比較大的數據,性能較好。

    可是缺點也比較明顯,Memcached嚴格來說沒有集羣機制,橫向擴展徹底靠客戶端來實現。

    另外Memcached沒法持久化,一旦掛了數據就都丟失了,若是想實現高可用,也是須要客戶端進行雙寫才能夠。

  Redis的數據結構比較豐富,提供持久化的功能,提供成熟的主備同步,故障切換的功能,從而保證了高可用性。

  另外微服務拆分之後,有時候處理一個訂單要通過很是多的服務,處理過程會比較慢,這個時候須要使用消息隊列,讓服務之間的調用變成對於消息的訂閱,實現異步處理。

    RabbitMQ和Kafka是經常使用的消息隊列,當事件比較重要的時候,會結合數據庫實現可靠消息隊列。

第四個層次是基礎服務層,有的時候成爲中颱層,

  將通用的能力抽象爲服務對外提供原子化接口。

    這樣上層能夠根據業務需求,經過靈活的組合這些原子化接口,靈活的應對業務需求的變化,實現能力的複用,以及數據的統一管理,

      例如用戶數據,支付數據,不會分散到各個應用中。

  另外基礎服務層稱爲應用和數據庫和緩存的一個分界線,不該該全部的應用都直接連數據庫,

    一旦出現分庫分表,數據庫遷移,緩存選型改變等,影響面會很是大,幾乎沒法執行。

    若是將這些底層的變動攔截在基礎服務層,上層僅僅使用基礎服務層的接口,這樣底層的變化會對上層透明,能夠逐步演進。

第五個層次是業務服務層,或者組合服務層,

  大部分的業務邏輯都是在這個層面實現,業務邏輯比較面向用戶,於是會常常改變,因此須要組合基礎服務的接口進行實現。

  在這一層,會常常進行服務的拆分,實現開發獨立,上線獨立,擴容獨立,容災降級獨立。

  微服務的拆分不該該是一個運動,而應該是一個遇到耦合痛點的時候,不斷解決,不斷演進的一個過程。

  微服務拆分以後,有時候須要經過分佈式事務,保證多個操做的原子性,也是在組合服務層來實現的。

第六個層次是用戶接口層,也即對終端客戶呈現出來的界面和APP,可是卻不只僅是界面這麼簡單。這一層有時候稱爲接入層。

  在這一層,動態資源和靜態資源應該分離,靜態資源應該在接入層作緩存,使用CDN進行緩存。

  也應該UI和API分離,界面應該經過組合API進行數據拼裝。

    API會經過統一的API網關進行統一的管理和治理,

    一方面後端組合服務層的拆分對APP是透明的,

  一方面當併發量比較大的時候,能夠在這一層實現限流和降級。

 

 

爲了支撐這六個層次,在上圖的左側是一些公共能力。

  • 持續集成和持續發佈是保證微服務拆分過程當中的快速迭代,以及變動後保證功能不變的,不引入新的Bug。
  • 服務發現和服務治理是微服務之間互相的調用,以及調用過程當中出現異常狀況下的熔斷,限流,降級策略。
  • 大數據和人工智能是經過收集各個層面的數據,例如用戶訪問數據,用戶下單數據,客服詢問數據等,結合統一的中臺,對數據進行分析,實現智能推薦。
  • 監控與APM是基礎設施的監控和應用的監控,發現資源層面的問題以及應用調用的問題。

 

瞭解雲計算的歷史演進與基本原理

瞭解一個知識的起點,就是了解他的歷史,也就是知道他是如何一步一步到今天的,這樣如此龐大的一個體系,實際上是逐步加進來的,這樣的知識體系對咱們來講,就不是一個冷冰冰的知識網,而是一個有血有肉的人,咱們只要沿着演進的線索,一步一步摸清楚他的脾氣就能夠了。

第一:雲計算的本質是實現從資源到架構的全面彈性。

  所謂的彈性就是時間靈活性和空間靈活性,也即想何時要就何時要,想要多少就要多少。

  資源層面的彈性也即實現計算、網絡、存儲資源的彈性。這個過程經歷了從物理機,到虛擬化,到雲計算的一個演進過程。

  架構層面的彈性也即實現通用應用和自有應用的彈性擴展。

    對於通用的應用,多集成爲PaaS平臺。

    對於本身的應用,經過基於腳本的Puppet, Chef, Ansible到基於容器鏡像的容器平臺CaaS。

    

 

 

第二:大數據包含數據的收集,數據的傳輸,數據的存儲,數據的處理和分析,數據的檢索和挖掘等幾個過程。

 

 

第三:人工智能經歷了基於專家系統的計劃經濟,基於統計的宏觀調控,基於神經網絡的微觀經濟學三個階段。

 

 

開源軟件是進階的利器

架構師除了要掌握大的架構和理論以外,指導落地也是必備的技能,

  所謂既要懂設計模式,也要懂代碼。

  

那從哪裏去學習這些良好的,有借鑑意義的,能夠落地的架構實踐呢?

很是建議你們瞭解,深刻研究,甚至參與貢獻開源軟件,由於收益匪淺。

第一:經過開源軟件,咱們能夠了解大牛們的架構原則,設計模式。

其實我們平時的工做中,是很難碰到大牛的,他多是你渴望而不可及的公司的員工,甚至在國外,你要想進這種公司,不刷個幾年題目,面試個N輪是進不去的。即使進去了,他多是公司的高層,天天很忙,不怎麼見獲得他,就算當面討教,時間也不會很長,很難深刻交流。也有的大牛會選擇自主創業,或者是自由職業者,神龍見首不見尾,到了大公司都見不到。

可是感謝互聯網和開源社區,將大牛們拉到了咱們身邊,你能夠訂閱郵件組,能夠加入討論羣,能夠看到大牛們的設計,看到不少人的評論,提問,還有大牛的回答,能夠看到大牛的設計也不是一蹴而就完美的,看到逐漸演進的過程,等等。這些都是可以幫助咱們快速提高水平的地方,有的時候,拿到一篇設計,都要查資料看半天,一開始均可能好多的術語都看不懂,不要緊肯下他,當你看blueprints愈來愈順暢的時候,你就進步了。

第二:經過開源軟件,咱們能夠學習到代碼級的落地實踐。

有時候咱們能看到不少大牛寫的書和文章,也能看到不少理論的書籍,可是存在一個問題是,理論都懂,可是仍是作很差架構。這是由於沒有看到代碼,全部的理論都是空中樓閣,當你到了具體的代碼設計層面,那些學會的設計模式,沒法轉化爲你本身的實踐。

好在開源軟件的代碼都是公開的,凝結了大牛的心血,也可以看到大牛在具體落地時候的取捨,一切那麼真實,看得見,摸得着。經過代碼進行學習,配合理論知識,更容易得到第一手的經驗,而且在本身作設計和寫代碼的時候,立刻可以映射到能夠參考的場景,讓咱們在作本身的系統的時候,少走彎路。

第三:經過開源軟件,咱們能夠加入社區,和其餘技術人員在同一背景下共同進步

大牛咱們每每不容易接觸到,正面討論技術問題的時間更是難能難得,可是沒有關係,開源軟件構建了一個社區,你們能夠在一塊兒討論,你是怎麼理解的,別人是怎麼理解的,越討論越交流,越明晰,有時候和比你經驗稍微豐富一點的技術人員交流,可能比直接和大牛對話更加有直接做用。大牛的話可能讓你消化半天,依然不知所云,大牛可能以爲不少普通人以爲的難點是顯而易見的,不屑去解釋。可是社區裏面的技術人員,可能和你同樣慢慢進步過來的,知道哪些點是當年本身困惑的,若是踩過這一個個的坑,他們一點撥,你就會豁然開朗。

並且每一個人遇到的具體狀況不一樣,從事的行業不一樣,客戶的需求不一樣,於是軟件設計的時候考慮的因素不一樣,大牛是牛,可是不必定可以遇到和你同樣的場景,可是社區裏面,有你的同行業的,背景相近的技術人員,大家能夠討論出符合大家特定場景的解決方案。

第四:經過開源軟件,咱們做爲我的,比較容易找到工做

咱們面試的時候,經常遇到的問題是,怎麼可以把在原來工做中本身的貢獻,理解,設計,技術能力。其實我發現不少程序員不能很好的作的這一點,因此形成不少人面試很吃虧。

  緣由之一是背景信息不對稱,例如原來面臨的業務上很難的問題,面試官因爲不理解背景,並且短期解釋不清楚,而輕視候選人的水平,我也遇到過不少面試官才聽了幾分鐘,就會說,這不挺簡單的,你這樣這樣不就好了,而後完全否認大家一個團隊忙了三年的事情。

  緣由之二是不少有能力的程序員不會表達,致使真正寫代碼的說不明白,可能原來在公司裏面一個績效很是好,一個績效很是差,可是到了面試官那裏就拉平了。

  緣由之三是新的公司不能肯定你在上家公司作的工做,到這一家都能用的,例如你作的工做有30%是和具體業務場景相關的,70%是通用技術,可能下家公司只會爲你的通用技術部分買單。

開源軟件的好處就是,參與的人所掌握的技能都是通的,並且你們在同一個上下文裏面對話,面試官和候選人之間的信息差比較少。掌握某個開源軟件有多難,不用候選人本身說,你們內心都有數。

對於不少技術能力強,可是表達能力較弱的極少數人員來說,talk is cheap, show me the code,代碼呈上去,就可以表現出實力來了,並且面試官也不須要根據短短的半個小時瞭解一我的,能夠作不少背景調查。

另外因爲掌握的技術的通用的,你到下一家公司,立刻就可以上手,幾乎不須要預熱時間,對於雙方都有好處。

第五:經過開源軟件,咱們做爲招聘方,比較容易招到相應人員。

若是在創業公司待過的朋友會了解到創業公司招人很難,人員流失很快,並且創業公司每每對於開發進度要求很快,由於你們都在搶時間。

於是開源軟件對於招聘方來說,也是好消息。

首先創業公司沒辦法像大公司同樣,弄這麼多的技術大牛,本身徹底落地一套本身的體系,使用開源軟件快速搭建一套平臺先上線是最好的選擇。

其次使用開源軟件,會使得招聘相對容易,市場上火的開源軟件會有大批的從業者,參與各類論壇和社區,比較容易挖到人。

最後,開源軟件的使用使得新人來了以後沒有預熱時間,來了就上手,保證開發速度。

 

我總結了九個步驟。

  • 1、手動安裝起來,必定要手動
  • 2、使用一下,推薦XXX in Action系列
  • 3、讀文檔,讀全部的官方文檔,記不住,看不懂也要讀下來
  • 4、瞭解核心的原理和算法,推薦XXX the definitive guide系列
  • 5、看一本源碼分析的書,會讓你的源碼閱讀之旅事半功倍
  • 6、開始閱讀核心邏輯源代碼
  • 7、編譯並Debug源代碼
  • 8、開發一個插件,或者對組件作少許的修改
  • 9、大量的運維實踐經驗和麪向真實場景的定製開發

因此作一個雲架構師,必定不能脫離代碼,反而要不斷的擁抱開源軟件。

 

 

瞭解Linux基礎知識

相關文章
相關標籤/搜索