從程序員進(jìn)階到架構(gòu)師,最全進(jìn)階詳解(下篇)-大型網(wǎng)站架構(gòu)篇
時(shí)間:2023-05-30 13:36:02 | 來源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-30 13:36:02 來源:網(wǎng)站運(yùn)營(yíng)
從程序員進(jìn)階到架構(gòu)師,最全進(jìn)階詳解(下篇)-大型網(wǎng)站架構(gòu)篇:
從程序員到架構(gòu)師進(jìn)階,將涉及到數(shù)據(jù)結(jié)構(gòu)和算法,Java編程語言掌握,Javaweb核心技術(shù),數(shù)據(jù)庫(kù),Java框架與必備工具,系統(tǒng)架構(gòu)設(shè)計(jì)等六大環(huán)節(jié)。
一共分為上篇、中篇、下篇,這是程序員進(jìn)階到架構(gòu)師系列篇的最后一篇,重點(diǎn)講解大型網(wǎng)站系統(tǒng)架構(gòu)設(shè)計(jì)。
優(yōu)知學(xué)院:從程序員進(jìn)階到架構(gòu)師,最全進(jìn)階詳解(上篇)
優(yōu)知學(xué)院:從程序員進(jìn)階到架構(gòu)師,最全進(jìn)階詳解(中篇-架構(gòu)進(jìn)階)
面向服務(wù)的體系架構(gòu)(SOA)
其實(shí)面向服務(wù)架構(gòu) SOA 思想概念的提出已不是什么新鮮事,大概在10年前就有不少相關(guān)書籍介紹過。當(dāng)時(shí) Java 企業(yè)應(yīng)用領(lǐng)域 J2EE 依然是主流,應(yīng)用程序被部署在龐大統(tǒng)一的符合 J2EE 規(guī)范的容器中運(yùn)行,在單一進(jìn)程中提供所有的功能。
早期的
SOA 通常和另外一個(gè)術(shù)語關(guān)聯(lián)在一起
ESB(企業(yè)服務(wù)總線)。 當(dāng)時(shí)在 SOA 的實(shí)施思路上無一例外的選擇了 ESB 模式來整合集成大量單一龐大的應(yīng)用,以保護(hù)企業(yè)前期投入成本。因此 ESB 其實(shí)是 SOA 特定歷史階段的一種實(shí)現(xiàn)方式。
然而,如今談到SOA服務(wù)架構(gòu)的場(chǎng)景,最具有代表性的的肯定就是阿里集團(tuán)下的:淘寶、支付寶等大數(shù)據(jù)、多個(gè)的業(yè)務(wù)模塊,成百上千的工程師一起開發(fā)的業(yè)務(wù)的場(chǎng)景。
正確的SOA架構(gòu)應(yīng)該怎樣定義?SOA(Service-Oriented Architecture),即面向服務(wù)的架構(gòu),SOA是一種粗粒度、松耦合服務(wù)架構(gòu),服務(wù)之間通過簡(jiǎn)單、精確定義接口進(jìn)行通訊,不涉及底層編程接口和通訊模型。
面向服務(wù)架構(gòu),本質(zhì)上就是將之前的單體應(yīng)用拆分成多個(gè)應(yīng)用,每個(gè)應(yīng)用之間是通過分布式服務(wù)框架或者是一些RPC的框架進(jìn)行通訊交互,需要服務(wù)化提供的三大能力:
第一,是提供的物理層面對(duì)業(yè)務(wù)分解抽象的能力
第二,是解決了系統(tǒng)的一個(gè)水平擴(kuò)展問題。
第三,是能夠讓一家公司具備百人以上的團(tuán)隊(duì)進(jìn)行協(xié)作開發(fā)的能力,即提高我們的開發(fā)效能。
面向服務(wù)設(shè)計(jì),因?yàn)樯婕暗椒植际竭@一塊,技術(shù)涉及非常多,主要包括像分布式服務(wù)框架、注冊(cè)中心,一些序列化化、反序列化的知識(shí)以及RPC的框架,服務(wù)化之后很重要一點(diǎn)就是需要有服務(wù)治理,需要有負(fù)載均衡、軟負(fù)載,需要有配置中心、消息中心等等。每一種技術(shù)都是一個(gè)比較深的主題,大家可以自行研究一下這方面的技術(shù)。
也可以參考阿里開源出來的Dubbo和HFS,阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,以及SOA服務(wù)治理方案。
大型網(wǎng)站架構(gòu)設(shè)計(jì)能力
其實(shí)就是要很清楚整個(gè)技術(shù)架構(gòu)的演變歷程,知道每個(gè)階段的瓶頸在哪里,以及對(duì)應(yīng)的解決方案。
隨著互聯(lián)網(wǎng)技術(shù)迅速發(fā)展和演變,不斷改變的商業(yè)化應(yīng)用系統(tǒng)越來越復(fù)雜,由單一的應(yīng)用架構(gòu)到垂直的應(yīng)用架構(gòu),但還是面臨的擴(kuò)容的問題。流量分散在各個(gè)系統(tǒng)中,雖然體積可控,但對(duì)開發(fā)人員和維護(hù)人員帶來極麻煩。此時(shí),將核心的業(yè)務(wù)單獨(dú)提煉出來作為單獨(dú)的系統(tǒng)對(duì)外提供服務(wù)。達(dá)成業(yè)務(wù)之間復(fù)用,系統(tǒng)也將演變成分布式系統(tǒng)架構(gòu)。分布式架構(gòu)是各組件分布在網(wǎng)絡(luò)計(jì)算機(jī)上、組件之間僅僅通過消息傳遞來通信并協(xié)調(diào)行動(dòng),與上面提到的SOA服務(wù)架構(gòu)一脈相承。
大型網(wǎng)站最終都會(huì)走向大型分布式業(yè)務(wù)場(chǎng)景
搭建分布系統(tǒng)的基礎(chǔ)設(shè)施緩存搭建分布式緩存搭建 memcached ,redis(推薦),動(dòng)態(tài)、靜態(tài)數(shù)據(jù)的緩存,以及配合單點(diǎn)登錄的使用等。
CDN搭建為了應(yīng)付復(fù)雜的網(wǎng)絡(luò)環(huán)境和不同地區(qū)用戶的訪問,通過CDN和反向代理加快用戶訪問的速度,同時(shí)減輕后端服務(wù)器的負(fù)載壓力。CDN與反向代理的基本原理都是緩存。
持久化儲(chǔ)存搭建Hbase、MySQL、Redis傳統(tǒng)的IOE方案: IBM小型機(jī)Oracle數(shù)據(jù)庫(kù) EMC持久儲(chǔ)存成本很高。傳統(tǒng)的數(shù)據(jù)庫(kù)提供完整地acid功能,并且提供豐富的內(nèi)連接外連接關(guān)聯(lián)查詢等功能。但是,對(duì)于高并發(fā)應(yīng)用來說,有的時(shí)候會(huì)犧牲關(guān)聯(lián)查詢事務(wù)數(shù)據(jù)一致性(降級(jí)為最終一致性)。
Hbase有更好地伸縮能力,更適合海量數(shù)據(jù)儲(chǔ)存。并發(fā)寫入十分出色,能夠支持多regionserver同時(shí)寫入。但是其本身對(duì)于查詢的支持力度有限,比如group by order by join等。
Redis是一個(gè)key-value類型的數(shù)據(jù)庫(kù),能夠支持更高的并發(fā)量,而且支持的數(shù)據(jù)類型也比其他的key-value數(shù)據(jù)庫(kù)的數(shù)據(jù)類型多。
消息系統(tǒng)搭建目前使用較多的消息隊(duì)列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
使用場(chǎng)景也是非常多:異步處理,應(yīng)用解耦,流量削鋒和消息通訊四個(gè)場(chǎng)景。
還有搜索引擎系統(tǒng)、文件系統(tǒng)、日志系統(tǒng)、數(shù)據(jù)倉(cāng)庫(kù)等。
分布式文件系統(tǒng)和分布式數(shù)據(jù)庫(kù)一般先分庫(kù),如果分庫(kù)后查詢?nèi)匀宦?,于是按照分?kù)的思想開始做分表的工作數(shù)據(jù)庫(kù)采用分布式數(shù)據(jù)庫(kù)(所有節(jié)點(diǎn)的數(shù)據(jù)加起來才算是整體數(shù)據(jù)),文件系統(tǒng)采用分布式文件系統(tǒng)任何強(qiáng)大的單一服務(wù)器都滿足不了大型系統(tǒng)持續(xù)增長(zhǎng)的業(yè)務(wù)需求,數(shù)據(jù)庫(kù)讀寫分離隨著業(yè)務(wù)的發(fā)展最終也將無法滿足需求,需要使用分布式數(shù)據(jù)庫(kù)及分布式文件系統(tǒng)來支撐。
分布式數(shù)據(jù)庫(kù)是系統(tǒng)數(shù)據(jù)庫(kù)拆分的最后方法,只有在單表數(shù)據(jù)規(guī)模非常龐大的時(shí)候才使用,更常用的數(shù)據(jù)庫(kù)拆分手段是業(yè)務(wù)分庫(kù),將不同的業(yè)務(wù)數(shù)據(jù)庫(kù)部署在不同的物理服務(wù)器上。
比如淘寶中期開始的數(shù)據(jù)庫(kù)端按照業(yè)務(wù)垂直拆分:按照業(yè)務(wù)交易數(shù)據(jù)庫(kù)、用戶數(shù)據(jù)庫(kù)、商品數(shù)據(jù)庫(kù)、店鋪數(shù)據(jù)庫(kù)等進(jìn)行拆分。
還有就是水平擴(kuò)展,分庫(kù)分表,再結(jié)合讀寫分離一起。當(dāng)然,分庫(kù)分表需要涉及到對(duì)應(yīng)的SQL路由規(guī)則主庫(kù)備庫(kù)等,淘寶設(shè)計(jì)了一套TDDL來解決這些問題,應(yīng)用端只需配置對(duì)應(yīng)的規(guī)則即可,對(duì)應(yīng)用端的沒有任何侵入的設(shè)計(jì)。
采用sql和nosql混搭搭建隨著業(yè)務(wù)越來越復(fù)雜,對(duì)數(shù)據(jù)存儲(chǔ)和檢索的需求也越來越復(fù)雜,系統(tǒng)需要采用一些非關(guān)系型數(shù)據(jù)庫(kù)如NoSQL和分?jǐn)?shù)據(jù)庫(kù)查詢技術(shù)如搜索引擎。應(yīng)用服務(wù)器通過統(tǒng)一數(shù)據(jù)訪問模塊訪問各種數(shù)據(jù),減輕應(yīng)用程序管理諸多數(shù)據(jù)源的麻煩。
代碼業(yè)務(wù)拆分縱向拆分:
將一個(gè)大應(yīng)用拆分為多個(gè)小應(yīng)用,如果新業(yè)務(wù)較為獨(dú)立,那么就直接將其設(shè)計(jì)部署為一個(gè)獨(dú)立的Web應(yīng)用系統(tǒng)、縱向拆分相對(duì)較為簡(jiǎn)單,通過梳理業(yè)務(wù),將較少相關(guān)的業(yè)務(wù)剝離即可。
橫向拆分:
將復(fù)用的業(yè)務(wù)拆分出來,獨(dú)立部署為分布式服務(wù),新增業(yè)務(wù)只需要調(diào)用這些分布式服務(wù)、橫向拆分需要識(shí)別可復(fù)用的業(yè)務(wù),設(shè)計(jì)服務(wù)接口,規(guī)范服務(wù)依賴關(guān)系。
還要考慮機(jī)房容災(zāi)以及系統(tǒng)運(yùn)維監(jiān)控等。
如果對(duì)大型網(wǎng)站分布式架構(gòu)有興趣,也可以查看官網(wǎng)文章淘寶發(fā)展歷程最具決定性的一次技術(shù)架構(gòu)演變,文章里有詳細(xì)的介紹淘寶的整個(gè)架構(gòu)演變歷程和步驟。
以上就是完整的從程序員進(jìn)階到架構(gòu)師的上、中、下篇內(nèi)容,更多架構(gòu)相關(guān)的內(nèi)容請(qǐng)關(guān)注優(yōu)知學(xué)院公眾號(hào)獲取。
作者:IT人升職加薪進(jìn)階站 優(yōu)知學(xué)院 (www.youzhixueyuan.com,微信公眾號(hào):youzhixueyuan)創(chuàng)始人陳睿|mikechen,歷任淘寶高級(jí)軟件工程師、盛大架構(gòu)師、百度研發(fā)經(jīng)理、攜程定制旅游CTO,分享職場(chǎng)、架構(gòu)、CTO進(jìn)階經(jīng)驗(yàn)和心得。