指導(dǎo)原則
書(shū)中所列舉的,里有一些可能并不是原則,而是技巧。我理解的原則如下:
高并發(fā)原則:
無(wú)狀態(tài)設(shè)計(jì):因?yàn)橛袪顟B(tài)可能涉及鎖操作,鎖又可能導(dǎo)致并發(fā)的串行化。保持合理的粒度:無(wú)論拆分還是服務(wù)化,其實(shí)就是服務(wù)粒度控制,控制粒度為了分散請(qǐng)求提高并發(fā),或?yàn)榱藦墓芾淼冉嵌忍岣呖刹傩?。緩存、?duì)列、并發(fā)等技巧在高并發(fā)設(shè)計(jì)上可供參考,但需依場(chǎng)景使用。高可用原則:
系統(tǒng)的任何發(fā)布必須具有可回滾能力。系統(tǒng)任何外部依賴必須準(zhǔn)確衡量是否可降級(jí),是否可無(wú)損降級(jí),并提供降級(jí)開(kāi)關(guān)。系統(tǒng)對(duì)外暴露的接口必須配置好限流,限流值必須盡量準(zhǔn)確可靠。業(yè)務(wù)設(shè)計(jì)原則:
安全性:防抓取,防刷單、防表單重復(fù)提交,等等等等。at least 消費(fèi),應(yīng)考慮是否采用冪等設(shè)計(jì)業(yè)務(wù)流程動(dòng)態(tài)化,業(yè)務(wù)規(guī)則動(dòng)態(tài)化系統(tǒng)owner負(fù)責(zé)制、人員備份制、值班制系統(tǒng)文檔化后臺(tái)操作可追溯以上原則只是大千世界中的一小部分,讀者應(yīng)當(dāng)在工作學(xué)習(xí)中點(diǎn)滴積累。
高可用
我們先說(shuō)高可用的本質(zhì)訴求:高可用就是抵御不確定性,保證系統(tǒng)724小時(shí)健康服務(wù)*。關(guān)于高可用,我們其實(shí)面對(duì)的問(wèn)題就是對(duì)抗不確定性,這個(gè)不確定性來(lái)自四面八方。比如大地震,會(huì)導(dǎo)致整個(gè)機(jī)房中斷,如何應(yīng)對(duì)?比如負(fù)責(zé)核心系統(tǒng)的工程師離職了,如何應(yīng)對(duì)?再比如下游接口掛了,如何應(yīng)對(duì)?系統(tǒng)磁盤壞了,數(shù)據(jù)面臨丟失風(fēng)險(xiǎn),如何應(yīng)對(duì)?我想關(guān)于上述問(wèn)題的應(yīng)對(duì)方式,大家在工作中或多或少都有所了解,而這個(gè)不確定性的處理過(guò)程,就是容災(zāi),其不同的‘災(zāi)難’,對(duì)應(yīng)不同的容災(zāi)級(jí)別。
為了對(duì)抗這些不同級(jí)別的不確定性,就要付出不同級(jí)別的成本,因此可用性也應(yīng)是有標(biāo)準(zhǔn)的。這標(biāo)準(zhǔn)就是大家常說(shuō)的N個(gè)9。隨著N的增加,成本也相應(yīng)增加,那如何在達(dá)到業(yè)務(wù)需要的可用性的基礎(chǔ)上,盡量節(jié)省成本?這也是一個(gè)值得思考的話題。除此之外,100%減去這N個(gè)9就說(shuō)所謂的平均故障時(shí)間(MTBF),很多人只關(guān)心那些9,而忽略了故障處理時(shí)間,這是不該的:你的故障處理速度越快,系統(tǒng)的可用性才有可能越高。
上面扯了一些可用性概念上的東西,下面來(lái)說(shuō)一下技巧。開(kāi)濤的書(shū)中沒(méi)有對(duì)可用性技巧做出一個(gè)分類,我這里則嘗試使用‘事情’來(lái)分個(gè)類。這里的‘事’就是故障,分為:事前(故障發(fā)生以前)、事發(fā)(故障發(fā)生到系統(tǒng)或人感知到故障)、事中(故障發(fā)生到故障處理這段時(shí)間)、事后(故障結(jié)束之后)。
按照上述分類,不同的階段應(yīng)有著不同的技巧:
事前:副本、隔離、配額、提前預(yù)案、探知事發(fā):監(jiān)控、報(bào)警事中:降級(jí)、回滾、應(yīng)急預(yù)案,failXXX系列事后:復(fù)盤、思考、技改事前
副本技術(shù)
大自然是副本技術(shù)當(dāng)之無(wú)愧的集大成者,無(wú)論是冰河時(shí)代,還是隕石撞擊地球所帶來(lái)的毀滅性打擊,物種依然綿綿不絕的繁衍,這便是基因復(fù)制的作用。副本是對(duì)抗不確定性的有力武器,把副本技術(shù)引入計(jì)算機(jī)系統(tǒng),也會(huì)帶來(lái)高可用性的提升。無(wú)狀態(tài)服務(wù)集群便是副本的一個(gè)應(yīng)用,因?yàn)闆](méi)有狀態(tài),便可水平伸縮,而這些無(wú)狀態(tài)服務(wù)器之間需要一層代理來(lái)統(tǒng)一調(diào)度管理,這便有了反向代理。當(dāng)代理通過(guò)心跳檢測(cè)機(jī)制檢測(cè)到有一臺(tái)機(jī)器出現(xiàn)問(wèn)題時(shí),就將其下線,其他‘副本’機(jī)器繼續(xù)提供服務(wù);存儲(chǔ)領(lǐng)域也是經(jīng)常使用副本技術(shù)的,比如OB的三地三中心五副本技術(shù)等,mysql主備切換,rabbitMQ的鏡像隊(duì)列,磁盤的RAID技術(shù),各種nosql中的分區(qū)副本,等等等等,數(shù)不勝數(shù),幾乎所有保證高可用的系統(tǒng)都有冗余副本存在。
隔離技術(shù)
書(shū)上提到了很多種隔離:線程隔離、進(jìn)程隔離、集群隔離、機(jī)房隔離、讀寫(xiě)隔離、動(dòng)靜隔離、爬蟲(chóng)隔離、熱點(diǎn)隔離、硬件資源隔離。在我看來(lái),這些隔離其實(shí)就是一種,即資源隔離,無(wú)論線程、進(jìn)程、硬件、機(jī)房、集群都是一種資源;動(dòng)態(tài)資源和靜態(tài)資源也不過(guò)是資源的一種分類;熱點(diǎn)隔離也即是熱點(diǎn)資源和非熱點(diǎn)資源的隔離;讀寫(xiě)隔離不過(guò)僅僅是資源的使用方式而已,相同的兩份資源,一份用來(lái)寫(xiě),一份用來(lái)讀。因此,隔離的本質(zhì),其實(shí)就是對(duì)資源的獨(dú)立保護(hù)。因?yàn)槊總€(gè)資源都得到了獨(dú)立的保護(hù),其中一個(gè)資源出了問(wèn)題,不會(huì)影響到其他資源,這就提高了整體服務(wù)的可用性。人類使用隔離術(shù)也由來(lái)已久了,從農(nóng)業(yè)養(yǎng)殖,到股票投資,甚至關(guān)犯人的監(jiān)獄,都能找到隔離術(shù)的影子。
配額技術(shù)
配額技術(shù)通過(guò)限制資源供給來(lái)保護(hù)系統(tǒng),從而提高整體可用性。限流是配額技術(shù)的一種,它通過(guò)調(diào)節(jié)入口流量水位上線,來(lái)避免供給不足所導(dǎo)致的服務(wù)宕機(jī)。限流分為集群限流和單機(jī)限流,集群限流需要分布式基礎(chǔ)設(shè)施配合,單機(jī)限流則不需要。大部分業(yè)務(wù)場(chǎng)景使用單機(jī)限流足以,特殊場(chǎng)景(類秒殺等)下的限流則需限制整個(gè)集群。除此之外,限流這里我們還需要考慮幾點(diǎn):
如何設(shè)置合理的限流值?限流值的設(shè)定是需要經(jīng)過(guò)全鏈路壓測(cè)、妥善評(píng)估CPU容量、磁盤、內(nèi)存、IO等指標(biāo)與流量之間的變化關(guān)系(不一定線性關(guān)系)、結(jié)合業(yè)務(wù)預(yù)估和運(yùn)維經(jīng)驗(yàn)后,才能確定。對(duì)于被限流的流量如何處理?有幾種處理方式,其一直接丟棄,用溫和的文案提醒用戶;其二,靜默,俗稱的無(wú)損降級(jí),用緩存內(nèi)容刷新頁(yè)面;其三,蓄洪,異步回血,這一般用于事務(wù)型場(chǎng)景。會(huì)不會(huì)導(dǎo)致誤殺?單機(jī)限流會(huì)導(dǎo)致誤殺,尤其當(dāng)負(fù)載不均衡的情況下,很容易出現(xiàn)誤殺;單機(jī)限流值設(shè)定過(guò)小也容易出現(xiàn)誤殺的情況。探知技術(shù)
其只用于探知系統(tǒng)當(dāng)前可用性能力,無(wú)法切實(shí)提高系統(tǒng)可用性,做不好甚至還會(huì)降低系統(tǒng)可用性。壓測(cè)和演練和最常見(jiàn)的探知技術(shù) 。壓測(cè)分為全鏈路壓測(cè)和單鏈路壓測(cè),全鏈路壓測(cè)用于像雙十一大促活動(dòng)等,需要各上下游系統(tǒng)整體配合,單鏈路壓測(cè)一般驗(yàn)證功能或做簡(jiǎn)單的單機(jī)壓測(cè)提取性能指標(biāo)。全鏈路壓測(cè)的一般過(guò)程是:壓測(cè)目標(biāo)設(shè)定和評(píng)估,壓測(cè)改造,壓測(cè)腳本編寫(xiě)部署,壓測(cè)數(shù)據(jù)準(zhǔn)備,小流量鏈路驗(yàn)證,通知上下游系統(tǒng)owner,壓測(cè)預(yù)熱,壓測(cè),壓測(cè)結(jié)果評(píng)估報(bào)告,性能優(yōu)化。以上過(guò)程反復(fù)迭代,直到達(dá)到壓測(cè)目標(biāo)為止;演練一般按規(guī)模劃分:比如城市級(jí)別的容災(zāi)演練,機(jī)房級(jí)別的容災(zāi)演練,集群規(guī)模的容災(zāi)演練(DB集群,緩存集群,應(yīng)用集群等),單機(jī)級(jí)別的故障注入,預(yù)案演練等。演練的作用無(wú)需過(guò)多強(qiáng)調(diào),但演練一般發(fā)生在凌晨,也需要各系統(tǒng)owner配合排錯(cuò),著實(shí)累人,一般都是輪班去搞。
預(yù)案
預(yù)案一般分為提前預(yù)案(事前)和應(yīng)急預(yù)案(事中)。提前預(yù)案提前執(zhí)行,比如將系統(tǒng)臨時(shí)從高峰模式切換成節(jié)能模式;應(yīng)急預(yù)案關(guān)鍵時(shí)刻才執(zhí)行,主要用于止血,比如一鍵容災(zāi)切換等。預(yù)案技術(shù)一般要配合開(kāi)關(guān)使用,推預(yù)案一般也就是推開(kāi)關(guān)了。除此之外,預(yù)案也可和限流、回滾、降級(jí)等相結(jié)合,并可以作為一個(gè)定期演練項(xiàng)目。
事發(fā)
事發(fā)是指當(dāng)故障發(fā)生了到系統(tǒng)或人感知到故障準(zhǔn)備處理的這段時(shí)間,核心訴求即是如何快速、準(zhǔn)確的識(shí)別故障。
監(jiān)控和報(bào)警
一般出現(xiàn)故障的時(shí)候,老板大多會(huì)有三問(wèn):為什么才發(fā)現(xiàn)?為什么才解決?影響有多大?即使故障影響面較大,如果能迅速止血,在做復(fù)盤的時(shí)候多少能挽回一些面子,相反如果處理不及時(shí),即使小小的故障,都可能讓你丟了飯碗。越早識(shí)別故障,就能越早解決問(wèn)題,而這眼睛便是監(jiān)控和報(bào)警了。監(jiān)控報(bào)警耳熟能詳,這里不多贅述。
事中
事中是指當(dāng)故障發(fā)生時(shí),為了保證系統(tǒng)可用性,我們可以或必須做的事情。分為降級(jí)、回滾、應(yīng)急預(yù)案(見(jiàn)上文,這里不多數(shù)了),faillXXX系列。
降級(jí)
降級(jí)的內(nèi)涵豐富,我們只從鏈路角度去思考。降級(jí)的本質(zhì)是棄車保帥,通過(guò)臨時(shí)舍棄部分功能,保證系統(tǒng)整體可用性。降級(jí)雖然從整體上看系統(tǒng)仍然可用,但由于取舍的關(guān)系,那么可知所有的降級(jí)一定是有損的。不可能有真正的無(wú)損降級(jí),而常說(shuō)的無(wú)損降級(jí)指的是用戶體驗(yàn)無(wú)損。降級(jí)一定發(fā)生在層與層之間(上下游),要么a層臨時(shí)性不調(diào)用b層,這叫做熔斷,要么a層臨時(shí)調(diào)用c層(c層合理性一定<b層),這叫備用鏈路。無(wú)論是哪一種方式,都會(huì)面臨一個(gè)問(wèn)題:如何確定什么時(shí)候降級(jí),什么時(shí)候恢復(fù)?一般有兩種方式,其一是人工確認(rèn),通過(guò)監(jiān)控報(bào)警等反饋機(jī)制,人工識(shí)別故障,推送降級(jí),待故障恢復(fù)后在手動(dòng)回滾;其二是自適應(yīng)識(shí)別,最常用的指標(biāo)有超時(shí)時(shí)間、錯(cuò)誤次數(shù)、限值流等等,當(dāng)達(dá)到閾值時(shí)自動(dòng)執(zhí)行降級(jí),恢復(fù)時(shí)自動(dòng)回滾。這兩種方式無(wú)需對(duì)比,它們都是經(jīng)常采用的高可用技巧。除此之外,我們還要注意降級(jí)和強(qiáng)弱依賴的關(guān)系。強(qiáng)弱依賴表示的是鏈路上下游之間的依賴關(guān)系,是’是否可降級(jí)‘的一種專業(yè)表述。
我們?cè)賮?lái)看書(shū)中的一些降級(jí)的例子:①讀寫(xiě)降級(jí),實(shí)際上是存儲(chǔ)層和應(yīng)用層之間的降級(jí),采用備用鏈路切換方式,損失了一致性;②功能降級(jí),將部分功能關(guān)閉,實(shí)際上是應(yīng)用層和功能模塊層之間的降級(jí),采用熔斷方式,損失了部分功能。③爬蟲(chóng)降級(jí),實(shí)際上是搜索引擎爬蟲(chóng)和應(yīng)用系統(tǒng)之間的降級(jí),采用備用鏈路切換方式,將爬蟲(chóng)引導(dǎo)到靜態(tài)頁(yè)面,損失是引擎索引的建立和頁(yè)面收錄。
回滾
當(dāng)執(zhí)行某種變更出現(xiàn)故障時(shí),最為穩(wěn)妥和有效的辦法就是回滾。雖然回滾行之有效,但并不簡(jiǎn)單,因?yàn)榛貪L有一個(gè)大前提:變更必須具有可回滾性。而讓某一種變更具有可回滾的特性,是要耗費(fèi)很大力氣的。索性的是,大部分基礎(chǔ)服務(wù)已經(jīng)幫我們封裝好了這一特性,比如DB的事務(wù)回滾(DB事務(wù)機(jī)制),代碼庫(kù)回滾(GIT的文件版本控制),發(fā)布回滾(發(fā)布系統(tǒng)支持)等等。我們?cè)谌粘W兏僮鞯臅r(shí)候,必須要確定你的操作是否可回滾,并盡力保證所有變更均可回滾。如果不能回滾,是否可以進(jìn)行熱更新(比如發(fā)布應(yīng)用到app store)或最終一致性補(bǔ)償?shù)阮~外手段保證系統(tǒng)高可用。
failXXX系列
當(dāng)出現(xiàn)下游調(diào)用失敗時(shí),我們一般有幾種處理方式:
failretry,即失敗重試,需要配合退避時(shí)間,否則馬上重試不一定會(huì)有效果。failover,即所謂的故障轉(zhuǎn)移。比如調(diào)用下游a接口失敗,那么RPC的負(fù)載均衡器將會(huì)調(diào)用a接口提供方的其他機(jī)器進(jìn)行重試;在比如數(shù)據(jù)庫(kù)x掛了,應(yīng)用自適應(yīng)容災(zāi)將對(duì)x庫(kù)的調(diào)用切換到y(tǒng)庫(kù)調(diào)用,此y庫(kù)即可以是faillover庫(kù)(流水型業(yè)務(wù)),也可以備庫(kù)(狀態(tài)型業(yè)務(wù))。failsafe,即靜默,一般下游鏈路是弱依賴的時(shí)候,可以采用failsafe,即可和failover相結(jié)合,比如failover了3次還是失敗,那么執(zhí)行failsafe。failfast,立即報(bào)錯(cuò),failfast主要讓工程師快速的感知問(wèn)題所在,并及時(shí)進(jìn)行人工干預(yù)。failback,延遲補(bǔ)償(回血),一般可以采用消息隊(duì)列或定時(shí)掃描等。上面的1,2,4是屬于重試策略,即書(shū)中《超時(shí)與重試》章節(jié)所講到的重試。重試有個(gè)問(wèn)題:退避間隔是多少?重試幾次?一般在下游臨時(shí)抖動(dòng)的情況下,很短時(shí)間內(nèi)就可以恢復(fù);但當(dāng)下游完全不可用,那么很有可能重試多少次都不會(huì)成功,反而會(huì)對(duì)下游造成了更大的壓力,那這種情況就應(yīng)當(dāng)做用熔斷了。所以正確設(shè)定重試次數(shù)、選擇退避時(shí)間等都是需要仔細(xì)思考的。我們?cè)趤?lái)說(shuō)一下超時(shí),超時(shí)只是一種預(yù)防機(jī)制,不是故障應(yīng)對(duì)策略,其主要為了防止請(qǐng)求堆積——資源都用于等待下游請(qǐng)求返回了。堆積的后果自不用多說(shuō),重要的是如何選擇正確的超時(shí)時(shí)間?書(shū)上只說(shuō)了鏈路每個(gè)部分超時(shí)時(shí)間怎么配置,卻不知道應(yīng)配置多少,這是不夠全面的。
事后
復(fù)盤、思考、技改。不多贅述。
高并發(fā)
如果僅是追求高可用性,這其實(shí)并不難做,試想如果一年只有一個(gè)人訪問(wèn)你的系統(tǒng),只要這一個(gè)人訪問(wèn)成功,那你系統(tǒng)的‘’可用性‘就是100%了??涩F(xiàn)實(shí)是,隨著業(yè)務(wù)的發(fā)展,請(qǐng)求量會(huì)越來(lái)越高,進(jìn)而各種系統(tǒng)資源得以激活,那潛在風(fēng)險(xiǎn)也會(huì)慢慢的暴露出來(lái)。因此,做系統(tǒng)的難點(diǎn)之一便是:如何在高并發(fā)的條件下,保證系統(tǒng)的高可用。上文已經(jīng)說(shuō)了一些保證高可用的技巧,這節(jié)將結(jié)合開(kāi)濤的書(shū),說(shuō)說(shuō)高并發(fā)。
上圖是我們生活中常見(jiàn)的一個(gè)場(chǎng)景——排隊(duì)購(gòu)物。收銀員就是我們的服務(wù),每一個(gè)在隊(duì)列中的顧客都是一個(gè)請(qǐng)求。我們的本質(zhì)訴求是讓盡可能多的人都在合理的等待時(shí)間內(nèi)完成消費(fèi)。如何做到這一點(diǎn)呢?其一是提高收銀員的處理速度,他們處理的越快,單位時(shí)間內(nèi)就能服務(wù)更多的顧客;其二是增加人手,一名收銀員處理不過(guò)來(lái),我們就雇十名收銀員,十名不夠我們就雇傭一百名(如果不計(jì)成本);其三是減少訪問(wèn)人數(shù),也即分流過(guò)濾,將一些人提前過(guò)濾掉,或做活動(dòng)預(yù)熱(比如雙十一預(yù)熱),在高峰之前先滿足一部分人的需求。因此,想要高并發(fā)無(wú)外乎從以下幾個(gè)方面入手:
提高處理速度:緩存、異步增加處理人手:多線程(多進(jìn)程)、擴(kuò)容減少訪問(wèn)人數(shù):預(yù)處理(本文不涉及)提高處理速度
緩存
緩存之所以能夠提高處理速度,是因?yàn)椴煌O(shè)備的訪問(wèn)速度存在差異。緩存的話題可以扯幾本書(shū)不帶重樣的。從CPU可以一直扯到客戶端緩存,即從最底層一直到扯到最特近用戶的一層,每一層都可能或可以有緩存的存在。我們這里不扯這么多,只說(shuō)簡(jiǎn)單服務(wù)端緩存?,F(xiàn)在從幾個(gè)不同角度來(lái)看一下緩存:
從效果角度。命中率越高越好嗎?10萬(wàn)個(gè)店鋪數(shù)據(jù),緩存了1000個(gè),命中率穩(wěn)定100%,那是不是說(shuō),有99000個(gè)店鋪都是長(zhǎng)尾店鋪?緩存效果評(píng)估不能單看命中率。從回收策略。如果把緩存當(dāng)做數(shù)據(jù)庫(kù)一樣的存儲(chǔ)設(shè)備去用,那就沒(méi)有回收的說(shuō)法了(除非重啟或者宕機(jī),否則數(shù)據(jù)依然有效);如果只存儲(chǔ)熱數(shù)據(jù),那就有回收和替換的問(wèn)題?;厥沼袃煞N方式,一種是空間配額,另一種是時(shí)間配額。替換也有幾種方式,LRU,F(xiàn)IFO,LFU。從緩存使用模式角度:用戶直接操作緩存和db;用戶直接操作緩存,緩存幫助我們讀寫(xiě)DbB;從緩存分級(jí)角度。java堆內(nèi)緩存、java堆外緩存、磁盤緩存、分布式緩存,多級(jí)緩存。從緩存使用角度。null穿透問(wèn)題、驚群?jiǎn)栴}、緩存熱點(diǎn)問(wèn)題、緩存一致性問(wèn)題、讀寫(xiě)擴(kuò)散問(wèn)題。。。。。。更新方式。讀更新、寫(xiě)更新、異步更新。如果緩存集群涉及到異地多集群部署,再結(jié)合大數(shù)據(jù)量高并發(fā)業(yè)務(wù)場(chǎng)景,還會(huì)遇到很多更加復(fù)雜的問(wèn)題,這里就不一一列舉了。
異步
異步這里有幾點(diǎn)內(nèi)涵,其一是將多個(gè)同步調(diào)用變成異步并發(fā)調(diào)用,這樣就將總響應(yīng)時(shí)間由原來(lái)的t1+t2+t3+…..+tn變成了max(t1,t2,t3….,tn),這也叫異步編排;其二是在操作系統(tǒng)層面,使用asyc io以提高io處理性能;其三是將請(qǐng)求’轉(zhuǎn)儲(chǔ)‘,稍后異步進(jìn)行處理,一般使用隊(duì)列中間件。其中的異步編排,可以使用CompletableFuture;異步IO一般框架都做了封裝;而隊(duì)列中間件則是最為常用的技術(shù)之一,也是我們重點(diǎn)關(guān)注的對(duì)象。
業(yè)務(wù)允許延遲處理,是使用隊(duì)列中間件的大前提,即非實(shí)時(shí)系統(tǒng)或準(zhǔn)實(shí)時(shí)系統(tǒng)更適合使用。主要作用有:異步處理(增加吞吐),削峰蓄洪(保障穩(wěn)定性),數(shù)據(jù)同步(最終一致性組件),系統(tǒng)解耦(下游無(wú)需感知訂閱方)。
緩沖隊(duì)列:一般使用環(huán)形緩沖隊(duì)列,控制緩沖區(qū)大小。
任務(wù)隊(duì)列:一般用于任務(wù)調(diào)度系統(tǒng),比如線程池等,disrupter
消息隊(duì)列:一般意義上的消息中間件,不同業(yè)務(wù)場(chǎng)景需要的中間件能力不同,有的需要高吞吐,有的需要支持事務(wù),有的需要支持多客戶端,有的需要支持特定協(xié)議等等等等,妄圖開(kāi)發(fā)一個(gè)大而全的消息隊(duì)列,個(gè)人覺(jué)得不如提供多種隊(duì)列按需選型,之后在統(tǒng)一提供一個(gè)通信中臺(tái),全面整合消息能力。
請(qǐng)求隊(duì)列:就是處理請(qǐng)求的隊(duì)列,有點(diǎn)像流程引擎,可以做一些前置后置的入隊(duì)出隊(duì)處理,比如限流、過(guò)濾等等
數(shù)據(jù)總線隊(duì)列:比如canal,datax等數(shù)據(jù)(異構(gòu)或同構(gòu))同步用的。
優(yōu)先級(jí)隊(duì)列:一般大根堆實(shí)現(xiàn)
副本隊(duì)列:如果隊(duì)列支持回放,副本隊(duì)列有些冗余。
鏡像隊(duì)列:一般用于做隊(duì)列系統(tǒng)的高可用切換的。有時(shí)候也跨集群跨機(jī)房做復(fù)制,提供更多消費(fèi)者消費(fèi),增加投遞能力。
隊(duì)列的消費(fèi)端有pull模式或者push模式的選取。pull模式可以控制進(jìn)度,push模式則實(shí)時(shí)性更高一些;pull能支持單隊(duì)列上的有序,push很難支持。除了消費(fèi)模式,隊(duì)列還有一系列其他問(wèn)題請(qǐng)參考其他書(shū)籍,這里不多說(shuō)明了。
這里在補(bǔ)充一點(diǎn)關(guān)于異步的說(shuō)明。同步轉(zhuǎn)異步,可以提高吞吐量;異步轉(zhuǎn)同步,可以增加可靠性。
增加處理人手
多線程
多線程(多進(jìn)程)技術(shù)是‘增加處理人手’技術(shù)中最容易想到的,一般我們也廣泛采用。無(wú)論是web服務(wù)容器、網(wǎng)關(guān)、RPC服務(wù)端、消息隊(duì)列消費(fèi)和發(fā)送端等等都有使用多線程技術(shù)。其優(yōu)點(diǎn)也無(wú)需過(guò)多說(shuō)明。這里我們只說(shuō)一件重要的事情,即線程數(shù)的設(shè)置問(wèn)題,如果線程數(shù)過(guò)高則可能會(huì)吃光系統(tǒng)資源,如果過(guò)低又無(wú)法發(fā)揮多線程優(yōu)勢(shì)。一般設(shè)置的時(shí)候,會(huì)參考平均處理時(shí)長(zhǎng)、并發(fā)峰值、平均并發(fā)量、阻塞率、最長(zhǎng)可容忍響應(yīng)時(shí)間、CPU核心數(shù)等等,然后做一定的運(yùn)算,計(jì)算出線程數(shù)、core和max,以及阻塞隊(duì)列大小。具體算法可以自行谷歌。
擴(kuò)容
在無(wú)狀態(tài)服務(wù)下,擴(kuò)容可能是迄今為止效果最明顯的增加并發(fā)量的技巧之一。有臨時(shí)性并發(fā)問(wèn)題時(shí),可以直接提擴(kuò)容工單,立竿見(jiàn)影。但擴(kuò)容的最大問(wèn)題就是成本了,想想動(dòng)輒幾萬(wàn)的實(shí)體機(jī),如果只是為了支撐一個(gè)小時(shí)的大促,而平常利用率幾乎為0,那確實(shí)是浪費(fèi)。因此便有了彈性云,當(dāng)需要擴(kuò)容時(shí),借別人機(jī)器(阿里云)用完再還回去;以及離線在線混部,充分利用資源。
從擴(kuò)容方式角度講,分為垂直擴(kuò)容(scale up)和水平擴(kuò)容(scale out)。垂直擴(kuò)容就是增加單機(jī)處理能力,懟硬件,但硬件能力畢竟還是有限;水平擴(kuò)容說(shuō)白了就是增加機(jī)器數(shù)量,懟機(jī)器,但隨著機(jī)器數(shù)量的增加,單應(yīng)用并發(fā)能力并不一定與其呈現(xiàn)線性關(guān)系, 此時(shí)就可能需要進(jìn)行應(yīng)用服務(wù)化拆分了。
從數(shù)據(jù)角度講,擴(kuò)容可以分為無(wú)狀態(tài)擴(kuò)容和有狀態(tài)擴(kuò)容。無(wú)狀態(tài)擴(kuò)容一般就是指我們的應(yīng)用服務(wù)器擴(kuò)容;有狀態(tài)擴(kuò)容一般是指數(shù)據(jù)存儲(chǔ)擴(kuò)容,要么將一份數(shù)據(jù)拆分成不同的多份,即sharding,要么就整體復(fù)制n份,即副本。sharding遇到的問(wèn)題就是分片的可靠性,一般做轉(zhuǎn)移、rehash、分片副本;副本遇到的問(wèn)題是一致性性,一般做一致性算法,如paxos,raft等。
- 蜜度索驥:以跨模態(tài)檢索技術(shù)助力“企宣”向上生長(zhǎng)
- IDC:三季度全球以太網(wǎng)交換機(jī)收入同比下降7.9%、環(huán)比增長(zhǎng)6.6%
- Fortinet李宏凱:2025年在中國(guó)大陸啟動(dòng)SASE PoP節(jié)點(diǎn)部署 助力企業(yè)出海
- Fortinet李宏凱:2024年Fortinet全球客戶已超80萬(wàn)
- 央國(guó)企采購(gòu)管理升級(jí),合合信息旗下啟信慧眼以科技破局難點(diǎn)
- Apache Struts重大漏洞被黑客利用,遠(yuǎn)程代碼執(zhí)行風(fēng)險(xiǎn)加劇
- Crunchbase:2024年AI網(wǎng)絡(luò)安全行業(yè)風(fēng)險(xiǎn)投資超過(guò)26億美元
- 調(diào)查報(bào)告:AI與云重塑IT格局,77%的IT領(lǐng)導(dǎo)者視網(wǎng)絡(luò)安全為首要挑戰(zhàn)
- 長(zhǎng)江存儲(chǔ)發(fā)布聲明:從無(wú)“借殼上市”意愿
- 泛微·數(shù)智大腦Xiaoe.AI正式發(fā)布,千人現(xiàn)場(chǎng)體驗(yàn)數(shù)智化運(yùn)營(yíng)場(chǎng)景
- IDC:2024年第三季度北美IT分銷商收入增長(zhǎng)至202億美元
免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書(shū)面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。