摘要:然而在微服務(wù)化之前,建議先進(jìn)行容器化,在容器化之前,建議先無狀態(tài)化,當(dāng)整個(gè)流程容器化了,以后的微服務(wù)拆分才會(huì)水到渠成。
此文已由作者劉超授權(quán)網(wǎng)易云社區(qū)發(fā)布。
歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。
一、為什么要做無狀態(tài)化和容器化
很多應(yīng)用拆分成微服務(wù),是為了承載高并發(fā),往往一個(gè)進(jìn)程扛不住這么大的量,因而需要拆分成多組進(jìn)程,每組進(jìn)程承載特定的工作,根據(jù)并發(fā)的壓力用多個(gè)副本公共承擔(dān)流量。
將一個(gè)進(jìn)程變成多組進(jìn)程,每組進(jìn)程多個(gè)副本,需要程序的修改支撐這種分布式的架構(gòu),如果架構(gòu)不支持,僅僅在資源層創(chuàng)建多個(gè)副本是解決不了問題的。
很多人說,支撐雙十一是靠堆機(jī)器,誰不會(huì)?真正經(jīng)歷過的會(huì)覺得,能夠靠堆機(jī)器堆出來的,都不是問題,怕的是機(jī)器堆上去了,因?yàn)榧軜?gòu)的問題,并發(fā)量仍然上不去。
阻礙單體架構(gòu)變?yōu)榉植际郊軜?gòu)的關(guān)鍵點(diǎn)就在于狀態(tài)的處理。如果狀態(tài)全部保存在本地,無論是本地的內(nèi)存,還是本地的硬盤,都會(huì)給架構(gòu)的橫向擴(kuò)展帶來瓶頸。
狀態(tài)分為分發(fā),處理,存儲(chǔ)幾個(gè)過程,如果對(duì)于一個(gè)用戶的所有的信息都保存在一個(gè)進(jìn)程中,則從分發(fā)階段,就必須將這個(gè)用戶分發(fā)到這個(gè)進(jìn)程,否則無法對(duì)這個(gè)用戶進(jìn)行處理,然而當(dāng)一個(gè)進(jìn)程壓力很大的時(shí)候,根本無法擴(kuò)容,新啟動(dòng)的進(jìn)程根本無法處理那些保存在原來進(jìn)程的用戶的數(shù)據(jù),不能分擔(dān)壓力。
所以要講整個(gè)架構(gòu)分成兩個(gè)部分,無狀態(tài)部分和有狀態(tài)部分,而業(yè)務(wù)邏輯的部分往往作為無狀態(tài)的部分,而將狀態(tài)保存在有狀態(tài)的中間件中,如緩存,數(shù)據(jù)庫,對(duì)象存儲(chǔ),大數(shù)據(jù)平臺(tái),消息隊(duì)列等。
這樣無狀態(tài)的部分可以很容易的橫向擴(kuò)展,在用戶分發(fā)的時(shí)候,可以很容易分發(fā)到新的進(jìn)程進(jìn)行處理,而狀態(tài)保存到后端。而后端的中間件是有狀態(tài)的,這些中間件設(shè)計(jì)之初,就考慮了擴(kuò)容的時(shí)候,狀態(tài)的遷移,復(fù)制,同步等機(jī)制,不用業(yè)務(wù)層關(guān)心。
如圖所示,將架構(gòu)分為兩層,無狀態(tài)和有狀態(tài)。
容器和微服務(wù)是雙胞胎,因?yàn)槲⒎?wù)會(huì)將單體應(yīng)用拆分成很多小的應(yīng)用,因而運(yùn)維和持續(xù)集成會(huì)工作量變大,而容器技術(shù)能很好的解決這個(gè)問題。然而在微服務(wù)化之前,建議先進(jìn)行容器化,在容器化之前,建議先無狀態(tài)化,當(dāng)整個(gè)流程容器化了,以后的微服務(wù)拆分才會(huì)水到渠成。
二、無狀態(tài)化的幾個(gè)要點(diǎn)
前面說對(duì)于任何狀態(tài),需要考慮它的分發(fā),處理,存儲(chǔ)。
對(duì)于數(shù)據(jù)的存儲(chǔ),主要包含幾類數(shù)據(jù):
會(huì)話數(shù)據(jù)等,主要保存在內(nèi)存中。
結(jié)構(gòu)化數(shù)據(jù),主要是業(yè)務(wù)邏輯相關(guān)
文件圖片數(shù)據(jù),比較大,往往通過CDN下發(fā)
非結(jié)構(gòu)化數(shù)據(jù),例如文本,評(píng)論等
如果這些數(shù)據(jù)都保存在本地,和業(yè)務(wù)邏輯耦合在一起,就需要在數(shù)據(jù)分發(fā)的時(shí)候,將同一個(gè)用戶分到同一個(gè)進(jìn)程,這樣就會(huì)影響架構(gòu)的橫向擴(kuò)展。
對(duì)于保存在內(nèi)存里的數(shù)據(jù),例如Session,可以放在外部統(tǒng)一的緩存中。
對(duì)于業(yè)務(wù)相關(guān)的數(shù)據(jù),則應(yīng)該保存在統(tǒng)一的數(shù)據(jù)庫中,如果性能扛不住,可以進(jìn)行讀寫分離,如文章微服務(wù)化的數(shù)據(jù)庫設(shè)計(jì)與讀寫分離
如果性能還是抗住不,則可以使用分布式數(shù)據(jù)庫。
對(duì)于文件,照片之類的數(shù)據(jù),應(yīng)該存放在統(tǒng)一的對(duì)象存儲(chǔ)里面,通過CDN進(jìn)行預(yù)加載,如文章微服務(wù)的接入層設(shè)計(jì)與動(dòng)靜資源隔離
對(duì)于非結(jié)構(gòu)化數(shù)據(jù),可以存在在統(tǒng)一的搜索引擎里面,例如ElasticSearch。
如果所有的數(shù)據(jù)都放在外部的統(tǒng)一存儲(chǔ)上,則應(yīng)用就成了僅僅包含業(yè)務(wù)邏輯的無狀態(tài)應(yīng)用,可以進(jìn)行平滑的橫向擴(kuò)展。
而所有的外部統(tǒng)一存儲(chǔ),無論是緩存,數(shù)據(jù)庫,對(duì)象存儲(chǔ),搜索引擎,都有自身的分布式橫向擴(kuò)展機(jī)制。
在實(shí)行了無狀態(tài)化之后,就可以將有狀態(tài)的集群集中到一起,進(jìn)行跨機(jī)房的部署,實(shí)現(xiàn)跨機(jī)房的高可用性。而無狀態(tài)的部分可以通過Dubbo自動(dòng)發(fā)現(xiàn),當(dāng)進(jìn)程掛掉的時(shí)候,自動(dòng)重啟,自動(dòng)修復(fù),也可以進(jìn)行多機(jī)房的部署。
三、冪等的接口設(shè)計(jì)
但是還有一個(gè)遺留的問題,就是已經(jīng)分發(fā),正在處理,但是尚未存儲(chǔ)的數(shù)據(jù),肯定會(huì)在內(nèi)存中有一些,在進(jìn)程重啟的時(shí)候,數(shù)據(jù)還是會(huì)丟一些的,那這部分?jǐn)?shù)據(jù)怎么辦呢?
這部分就需要通過重試進(jìn)行解決,當(dāng)本次調(diào)用過程中失敗之后,前序的進(jìn)程會(huì)進(jìn)行重試,例如Dubbo就有重試機(jī)制。既然重試,就需要接口是冪等的,也即同一次交易,調(diào)用兩次轉(zhuǎn)賬1元,不能最終轉(zhuǎn)走2元。
接口分為查詢,插入,更新,刪除等操作。
對(duì)于查詢接口來講,本身就是冪等的,不用做特殊的判斷。
對(duì)于插入接口來講,如果每一個(gè)數(shù)據(jù)都有唯一的主鍵,也能保證插入的唯一性,一旦不唯一,則會(huì)報(bào)錯(cuò)。
對(duì)于更新操作來講,則比較復(fù)雜,分幾種情況。
一種情況是同一個(gè)接口,前后調(diào)用多次的冪等性。另一種情況是同一個(gè)接口,并發(fā)環(huán)境下調(diào)用多次的正確性。
為了保持冪等性,往往要有一個(gè)冪等表,通過傳入冪等參數(shù)匹配冪等表中ID的方式,保證每個(gè)操作只被執(zhí)行一次,而且在實(shí)行最終一致性的時(shí)候,可以通過不斷重試,保證最終接口調(diào)用的成功。
對(duì)于并發(fā)條件下,誰先調(diào)用,誰后調(diào)用,需要通過分布式鎖如Redis,Zookeeper等來實(shí)現(xiàn)同一個(gè)時(shí)刻只有一個(gè)請(qǐng)求被執(zhí)行,如何保證多次執(zhí)行結(jié)果仍然一致呢?則往往需要通過狀態(tài)機(jī),每個(gè)狀態(tài)只流轉(zhuǎn)一次。還有就是樂觀鎖,也即分布式的CAS操作,將狀態(tài)的判斷、更新整合在一條語句中,可以保證狀態(tài)流轉(zhuǎn)的原子性。樂觀鎖并不保證更新一定成功,需要有對(duì)應(yīng)的機(jī)制來應(yīng)對(duì)更新失敗。
四、容器的技術(shù)原理
無狀態(tài)化之后,實(shí)行容器化就十分順暢了,容器的不可改變基礎(chǔ)設(shè)施,以及容器基于容器平臺(tái)的掛掉自動(dòng)重啟,自動(dòng)修復(fù),都因?yàn)闊o狀態(tài)順暢無比。
關(guān)鍵技術(shù)一:Dockerfile
例如下面的Dockerfile。
為什么一定要用Dockerfile,而不建議通過保存鏡像的方式來生成鏡像呢?
這樣才能實(shí)現(xiàn)環(huán)境配置和環(huán)境部署代碼化 ,將Dockerfile維護(hù)在Git里面,有版本控制,并且通過自動(dòng)化的build的過程來生成鏡像,而鏡像中就是環(huán)境的配置和環(huán)境的部署,要修改環(huán)境應(yīng)先通過Git上面修改Dockerfile的方式進(jìn)行,這就是IaC。
關(guān)鍵技術(shù)二:容器鏡像
通過Dockerfile可以生成容器鏡像,容器的鏡像是分層保存,對(duì)于Dockerfile中的每一個(gè)語句,生成一層容器鏡像,如此疊加,每一層都有UUID。
容器鏡像可以打一個(gè)版本號(hào),放入統(tǒng)一的鏡像倉庫。
關(guān)鍵技術(shù)三:容器運(yùn)行時(shí)
容器運(yùn)行時(shí),是將容器鏡像之上加一層可寫入層,為容器運(yùn)行時(shí)所看到的文件系統(tǒng)。
容器運(yùn)行時(shí)使用了兩種隔離的技術(shù)。
一種是看起來是隔離的技術(shù),稱為namespace,也即每個(gè)namespace中的應(yīng)用看到的是不同的IP地址、用戶空間、程號(hào)等。
另一種是用起來是隔離的技術(shù),稱為cgroup,也即明明整臺(tái)機(jī)器有很多的CPU、內(nèi)存,而一個(gè)應(yīng)用只能用其中的一部分。
cgroup
網(wǎng)易云計(jì)算基礎(chǔ)服務(wù)深度整合了 IaaS、PaaS 及容器技術(shù),提供彈性計(jì)算、DevOps 工具鏈及微服務(wù)基礎(chǔ)設(shè)施等服務(wù),幫助企業(yè)解決 IT、架構(gòu)及運(yùn)維等問題,使企業(yè)更聚焦于業(yè)務(wù),是新一代的云計(jì)算平臺(tái),點(diǎn)擊可免費(fèi)試用。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25264.html
摘要:劉超,網(wǎng)易云計(jì)算首席架構(gòu)師,有多年的云計(jì)算架構(gòu)與開發(fā)經(jīng)歷,積累了豐富的企業(yè)級(jí)應(yīng)用的微服務(wù)化,容器化實(shí)戰(zhàn)經(jīng)驗(yàn)。近日,記者對(duì)劉超進(jìn)行了采訪,跟大家分享了微服務(wù)實(shí)戰(zhàn)的挑戰(zhàn)和一些常見的微服務(wù)誤解,以及他對(duì)微服務(wù)發(fā)展趨勢(shì)的判斷。 劉超,網(wǎng)易云計(jì)算首席架構(gòu)師,有10多年的云計(jì)算架構(gòu)與開發(fā)經(jīng)歷,積累了豐富的企業(yè)級(jí)應(yīng)用的微服務(wù)化,容器化實(shí)戰(zhàn)經(jīng)驗(yàn)。劉超將擔(dān)任今年 5 月份 QCon 全球軟件開發(fā)大會(huì)廣州...
摘要:飛貸金融科技副總裁陳定瑋大會(huì)現(xiàn)場,飛貸金融科技作為金融行業(yè)數(shù)據(jù)庫容器化的典型案例,為現(xiàn)場的容器愛好者帶來了題為金融領(lǐng)域數(shù)據(jù)庫生產(chǎn)容器化及應(yīng)用的實(shí)踐經(jīng)驗(yàn)分享。 2019年6月20日,由Rancher Labs(以下簡稱Rancher)主辦的第三屆企業(yè)容器創(chuàng)新大會(huì)(Enterprise Container Innovation Conference, 以下簡稱ECIC)在北京喜來登大酒店盛...
摘要:本文轉(zhuǎn)載自微信公眾號(hào)賬號(hào),作者為海航生態(tài)科技技術(shù)研究院大數(shù)據(jù)開發(fā)工程師高顏。文章介紹了海航生態(tài)科技輿情大數(shù)據(jù)平臺(tái)的容器化改造經(jīng)驗(yàn),包括初期技術(shù)架構(gòu)應(yīng)用容器化架構(gòu)遷移持續(xù)發(fā)布與部署。 本文轉(zhuǎn)載自微信公眾號(hào)Docker(賬號(hào):dockerone),作者為海航生態(tài)科技技術(shù)研究院大數(shù)據(jù)開發(fā)工程師高顏。 文章介紹了海航生態(tài)科技輿情大數(shù)據(jù)平臺(tái)的容器化改造經(jīng)驗(yàn),包括初期技術(shù)架構(gòu)、應(yīng)用容器化、架構(gòu)遷...
摘要:俗語有一招鮮,吃遍天。其中,的企業(yè)正在實(shí)施多云戰(zhàn)略,的企業(yè)采用混合云戰(zhàn)略,將公有云和私有云集成在一起。隨著混合云的五個(gè)一體化由戴爾易安信在戴爾科技峰會(huì)上對(duì)外發(fā)布,其混合云的新利器也正式登臺(tái)亮相了。俗語有一招鮮,吃遍天。說的是行走江湖須得有一技之長,方能到處謀生,不會(huì)餓了肚子。時(shí)過境遷,這句話放在今天依然有效。隨著IT環(huán)境正向混合云以及多云邁進(jìn),這一過程有沒有一招鮮的方法呢?讓客戶省時(shí)省力又省...
閱讀 654·2019-08-30 15:44
閱讀 1379·2019-08-30 11:02
閱讀 2980·2019-08-29 18:42
閱讀 3506·2019-08-29 16:16
閱讀 1719·2019-08-26 13:55
閱讀 1768·2019-08-26 13:45
閱讀 2384·2019-08-26 11:43
閱讀 3246·2019-08-26 10:32