溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

高并發(fā)的系統(tǒng)是怎樣的

發(fā)布時(shí)間:2021-10-25 16:14:28 來源:億速云 閱讀:105 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“高并發(fā)的系統(tǒng)是怎樣的”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“高并發(fā)的系統(tǒng)是怎樣的”吧!

微服務(wù)架構(gòu)演化

在互聯(lián)網(wǎng)早期的時(shí)候,單體架構(gòu)就足以支撐起日常的業(yè)務(wù)需求,大家的所有業(yè)務(wù)服務(wù)都在一個(gè)項(xiàng)目里,部署在一臺(tái)物理機(jī)器上。

所有的業(yè)務(wù)包括你的交易系統(tǒng)、會(huì)員信息、庫(kù)存、商品等等都夾雜在一起,當(dāng)流量一旦起來之后,單體架構(gòu)的問題就暴露出來了,機(jī)器掛了所有的業(yè)務(wù)全部無法使用了。

高并發(fā)的系統(tǒng)是怎樣的

于是,集群架構(gòu)的架構(gòu)開始出現(xiàn),單機(jī)無法抗住的壓力,最簡(jiǎn)單的辦法就是水平拓展橫向擴(kuò)容了,這樣,通過負(fù)載均衡把壓力流量分?jǐn)偟讲煌臋C(jī)器上,暫時(shí)是解決了單點(diǎn)導(dǎo)致服務(wù)不可用的問題。

高并發(fā)的系統(tǒng)是怎樣的

但是隨著業(yè)務(wù)的發(fā)展,在一個(gè)項(xiàng)目里維護(hù)所有的業(yè)務(wù)場(chǎng)景使開發(fā)和代碼維護(hù)變得越來越困難,一個(gè)簡(jiǎn)單的需求改動(dòng)都需要發(fā)布整個(gè)服務(wù),代碼的合并沖突也會(huì)變得越來越頻繁,同時(shí)線上故障出現(xiàn)的可能性越大。微服務(wù)的架構(gòu)模式就誕生了。

高并發(fā)的系統(tǒng)是怎樣的

把每個(gè)獨(dú)立的業(yè)務(wù)拆分開獨(dú)立部署,開發(fā)和維護(hù)的成本降低,集群能承受的壓力也提高了,再也不會(huì)出現(xiàn)一個(gè)小小的改動(dòng)點(diǎn)需要牽一發(fā)而動(dòng)全身了。

以上的點(diǎn)從高并發(fā)的角度而言,似乎都可以歸類為通過服務(wù)拆分和集群物理機(jī)器的擴(kuò)展提高了整體的系統(tǒng)抗壓能力,那么,隨之拆分而帶來的問題也就是高并發(fā)系統(tǒng)需要解決的問題。

RPC

微服務(wù)化的拆分帶來的好處和便利性是顯而易見的,但是與此同時(shí)各個(gè)微服務(wù)之間的通信就需要考慮了。

傳統(tǒng) HTTP 的通信方式對(duì)性能是極大的浪費(fèi),這時(shí)候就需要引入諸如 Dubbo 類的 RPC 框架,基于 TCP  長(zhǎng)連接的方式提高整個(gè)集群通信的效率。

高并發(fā)的系統(tǒng)是怎樣的

我們假設(shè)原來來自客戶端的 QPS 是 9000 的話,那么通過負(fù)載均衡策略分散到每臺(tái)機(jī)器就是 3000,而 HTTP 改為 RPC  之后接口的耗時(shí)縮短了,單機(jī)和整體的 QPS 就提升了。

而 RPC 框架本身一般都自帶負(fù)載均衡、熔斷降級(jí)的機(jī)制,可以更好的維護(hù)整個(gè)系統(tǒng)的高可用性。

那么說完 RPC,作為基本上國(guó)內(nèi)普遍的選擇 Dubbo 的一些基本原理就是接下來的問題。

高并發(fā)的系統(tǒng)是怎樣的

Dubbo 工作原理:

  • 服務(wù)啟動(dòng)的時(shí)候,provider 和 consumer 根據(jù)配置信息,連接到注冊(cè)中心 register,分別向注冊(cè)中心注冊(cè)和訂閱服務(wù)。

  • register 根據(jù)服務(wù)訂閱關(guān)系,返回 provider 信息到 consumer,同時(shí) consumer 會(huì)把 provider  信息緩存到本地。如果信息有變更,consumer 會(huì)收到來自 register 的推送。

  • consumer 生成代理對(duì)象,同時(shí)根據(jù)負(fù)載均衡策略,選擇一臺(tái) provider,同時(shí)定時(shí)向 monitor 記錄接口的調(diào)用次數(shù)和時(shí)間信息。

  • 拿到代理對(duì)象之后,consumer 通過代理對(duì)象發(fā)起接口調(diào)用。

  • provider 收到請(qǐng)求后對(duì)數(shù)據(jù)進(jìn)行反序列化,然后通過代理調(diào)用具體的接口實(shí)現(xiàn)。

高并發(fā)的系統(tǒng)是怎樣的

Dubbo 負(fù)載均衡策略:

  • 加權(quán)隨機(jī):假設(shè)我們有一組服務(wù)器 servers=[A, B, C],他們對(duì)應(yīng)的權(quán)重為 weights=[5, 3, 2],權(quán)重總和為 10。

現(xiàn)在把這些權(quán)重值平鋪在一維坐標(biāo)值上,[0, 5) 區(qū)間屬于服務(wù)器 A,[5, 8) 區(qū)間屬于服務(wù)器 B,[8, 10) 區(qū)間屬于服務(wù)器 C。

接下來通過隨機(jī)數(shù)生成器生成一個(gè)范圍在 [0, 10) 之間的隨機(jī)數(shù),然后計(jì)算這個(gè)隨機(jī)數(shù)會(huì)落到哪個(gè)區(qū)間上就可以了。

  • 最小活躍數(shù):每個(gè)服務(wù)提供者對(duì)應(yīng)一個(gè)活躍數(shù) active,初始情況下,所有服務(wù)提供者活躍數(shù)均為 0。每收到一個(gè)請(qǐng)求,活躍數(shù)加 1,完成請(qǐng)求后則將活躍數(shù)減  1。

在服務(wù)運(yùn)行一段時(shí)間后,性能好的服務(wù)提供者處理請(qǐng)求的速度更快,因此活躍數(shù)下降的也越快,此時(shí)這樣的服務(wù)提供者能夠優(yōu)先獲取到新的服務(wù)請(qǐng)求。

  • 一致性 hash:通過 hash 算法,把 provider 的 invoke 和隨機(jī)節(jié)點(diǎn)生成 hash,并將這個(gè) hash 投射到 [0, 2^32 -  1] 的圓環(huán)上,查詢的時(shí)候根據(jù) key 進(jìn)行 md5 然后進(jìn)行 hash,得到第一個(gè)節(jié)點(diǎn)的值大于等于當(dāng)前 hash 的 invoker。

  • 加權(quán)輪詢:比如服務(wù)器 A、B、C 權(quán)重比為 5:2:1,那么在 8 次請(qǐng)求中,服務(wù)器 A 將收到其中的 5 次請(qǐng)求,服務(wù)器 B 會(huì)收到其中的 2  次請(qǐng)求,服務(wù)器 C 則收到其中的 1 次請(qǐng)求。

集群容錯(cuò):

  • Failover Cluster 失敗自動(dòng)切換:Dubbo  的默認(rèn)容錯(cuò)方案,當(dāng)調(diào)用失敗時(shí)自動(dòng)切換到其他可用的節(jié)點(diǎn),具體的重試次數(shù)和間隔時(shí)間可用通過引用服務(wù)的時(shí)候配置,默認(rèn)重試次數(shù)為 1 也就是只調(diào)用一次。

  • Failback Cluster 快速失?。涸谡{(diào)用失敗,記錄日志和調(diào)用信息,然后返回空結(jié)果給 consumer,并且通過定時(shí)任務(wù)每隔 5  秒對(duì)失敗的調(diào)用進(jìn)行重試。

  • Failfast Cluster 失敗自動(dòng)恢復(fù):只會(huì)調(diào)用一次,失敗后立刻拋出異常。

  • Failsafe Cluster 失敗安全:調(diào)用出現(xiàn)異常,記錄日志不拋出,返回空結(jié)果。

  • Forking Cluster 并行調(diào)用多個(gè)服務(wù)提供者:通過線程池創(chuàng)建多個(gè)線程,并發(fā)調(diào)用多個(gè) provider,結(jié)果保存到阻塞隊(duì)列,只要有一個(gè)  provider 成功返回了結(jié)果,就會(huì)立刻返回結(jié)果。

  • Broadcast Cluster 廣播模式:逐個(gè)調(diào)用每個(gè) provider,如果其中一臺(tái)報(bào)錯(cuò),在循環(huán)調(diào)用結(jié)束后,拋出異常。

消息隊(duì)列

對(duì)于 MQ 的作用大家都應(yīng)該很了解了,削峰填谷、解耦。依賴消息隊(duì)列,同步轉(zhuǎn)異步的方式,可以降低微服務(wù)之間的耦合。

對(duì)于一些不需要同步執(zhí)行的接口,可以通過引入消息隊(duì)列的方式異步執(zhí)行以提高接口響應(yīng)時(shí)間。

在交易完成之后需要扣庫(kù)存,然后可能需要給會(huì)員發(fā)放積分,本質(zhì)上,發(fā)積分的動(dòng)作應(yīng)該屬于履約服務(wù),對(duì)實(shí)時(shí)性的要求也不高,我們只要保證最終一致性也就是能履約成功就行了。

對(duì)于這種同類性質(zhì)的請(qǐng)求就可以走 MQ 異步,也就提高了系統(tǒng)抗壓能力了。

高并發(fā)的系統(tǒng)是怎樣的

對(duì)于消息隊(duì)列而言,怎么在使用的時(shí)候保證消息的可靠性、不丟失?

消息可靠性

消息丟失可能發(fā)生在生產(chǎn)者發(fā)送消息、MQ 本身丟失消息、消費(fèi)者丟失消息3個(gè)方面。

①生產(chǎn)者丟失

生產(chǎn)者丟失消息的可能點(diǎn)在于程序發(fā)送失敗拋異常了沒有重試處理,或者發(fā)送的過程成功但是過程中網(wǎng)絡(luò)閃斷 MQ 沒收到,消息就丟失了。

由于同步發(fā)送的一般不會(huì)出現(xiàn)這樣使用方式,所以我們就不考慮同步發(fā)送的問題,我們基于異步發(fā)送的場(chǎng)景來說。

異步發(fā)送分為兩個(gè)方式:異步有回調(diào)和異步無回調(diào),無回調(diào)的方式,生產(chǎn)者發(fā)送完后不管結(jié)果可能就會(huì)造成消息丟失,而通過異步發(fā)送+回調(diào)通知+本地消息表的形式我們就可以做出一個(gè)解決方案。

以下單的場(chǎng)景舉例:

  • 下單后先保存本地?cái)?shù)據(jù)和 MQ 消息表,這時(shí)候消息的狀態(tài)是發(fā)送中,如果本地事務(wù)失敗,那么下單失敗,事務(wù)回滾。

  • 下單成功,直接返回客戶端成功,異步發(fā)送 MQ 消息。

  • MQ 回調(diào)通知消息發(fā)送結(jié)果,對(duì)應(yīng)更新數(shù)據(jù)庫(kù) MQ 發(fā)送狀態(tài)。

  • JOB 輪詢超過一定時(shí)間(時(shí)間根據(jù)業(yè)務(wù)配置)還未發(fā)送成功的消息去重試。

高并發(fā)的系統(tǒng)是怎樣的

在監(jiān)控平臺(tái)配置或者 JOB 程序處理超過一定次數(shù)一直發(fā)送不成功的消息,告警,人工介入。

一般而言,對(duì)于大部分場(chǎng)景來說異步回調(diào)的形式就可以了,只有那種需要完全保證不能丟失消息的場(chǎng)景我們做一套完整的解決方案。

②MQ 丟失

如果生產(chǎn)者保證消息發(fā)送到 MQ,而 MQ 收到消息后還在內(nèi)存中,這時(shí)候宕機(jī)了又沒來得及同步給從節(jié)點(diǎn),就有可能導(dǎo)致消息丟失。

比如 RocketMQ:RocketMQ  分為同步刷盤和異步刷盤兩種方式,默認(rèn)的是異步刷盤,就有可能導(dǎo)致消息還未刷到硬盤上就丟失了,可以通過設(shè)置為同步刷盤的方式來保證消息可靠性,這樣即使 MQ  掛了,恢復(fù)的時(shí)候也可以從磁盤中去恢復(fù)消息。

比如 Kafka 也可以通過配置做到:

acks=all  只有參與復(fù)制的所有節(jié)點(diǎn)全部收到消息,才返回生產(chǎn)者成功。這樣的話除非所有的節(jié)點(diǎn)都掛了,消息才會(huì)丟失。replication.factor=N,設(shè)置大于1的數(shù),這會(huì)要求每個(gè)partion至少有2個(gè)副本min.insync.replicas=N,設(shè)置大于1的數(shù),這會(huì)要求leader至少感知到一個(gè)follower還保持著連接retries=N,設(shè)置一個(gè)非常大的值,讓生產(chǎn)者發(fā)送失敗一直重試

雖然我們可以通過配置的方式來達(dá)到 MQ 本身高可用的目的,但是都對(duì)性能有損耗,怎樣配置需要根據(jù)業(yè)務(wù)做出權(quán)衡。

③消費(fèi)者丟失

消費(fèi)者丟失消息的場(chǎng)景:消費(fèi)者剛收到消息,此時(shí)服務(wù)器宕機(jī),MQ 認(rèn)為消費(fèi)者已經(jīng)消費(fèi),不會(huì)重復(fù)發(fā)送消息,消息丟失。

RocketMQ 默認(rèn)是需要消費(fèi)者回復(fù) ack 確認(rèn),而 Kafka 需要手動(dòng)開啟配置關(guān)閉自動(dòng) offset。

消費(fèi)方不返回 ack 確認(rèn),重發(fā)的機(jī)制根據(jù) MQ  類型的不同發(fā)送時(shí)間間隔、次數(shù)都不盡相同,如果重試超過次數(shù)之后會(huì)進(jìn)入死信隊(duì)列,需要手工來處理了。(Kafka 沒有這些)

高并發(fā)的系統(tǒng)是怎樣的

消息的最終一致性

事務(wù)消息可以達(dá)到分布式事務(wù)的最終一致性,事務(wù)消息就是MQ提供的類似XA的分布式事務(wù)能力。

半事務(wù)消息就是 MQ 收到了生產(chǎn)者的消息,但是沒有收到二次確認(rèn),不能投遞的消息。

實(shí)現(xiàn)原理如下:

  • 生產(chǎn)者先發(fā)送一條半事務(wù)消息到 MQ。

  • MQ 收到消息后返回 ack 確認(rèn)。

  • 生產(chǎn)者開始執(zhí)行本地事務(wù)。

  • 如果事務(wù)執(zhí)行成功發(fā)送 commit 到 MQ,失敗發(fā)送 rollback。

  • 如果 MQ 長(zhǎng)時(shí)間未收到生產(chǎn)者的二次確認(rèn) commit 或者 rollback,MQ 對(duì)生產(chǎn)者發(fā)起消息回查。

  • 生產(chǎn)者查詢事務(wù)執(zhí)行最終狀態(tài)。

  • 根據(jù)查詢事務(wù)狀態(tài)再次提交二次確認(rèn)。

最終,如果MQ收到二次確認(rèn)commit,就可以把消息投遞給消費(fèi)者,反之如果是rollback,消息會(huì)保存下來并且在3天后被刪除。

高并發(fā)的系統(tǒng)是怎樣的

數(shù)據(jù)庫(kù)

對(duì)于整個(gè)系統(tǒng)而言,最終所有的流量的查詢和寫入都落在數(shù)據(jù)庫(kù)上,數(shù)據(jù)庫(kù)是支撐系統(tǒng)高并發(fā)能力的核心。

怎么降低數(shù)據(jù)庫(kù)的壓力,提升數(shù)據(jù)庫(kù)的性能是支撐高并發(fā)的基石。主要的方式就是通過讀寫分離和分庫(kù)分表來解決這個(gè)問題。

對(duì)于整個(gè)系統(tǒng)而言,流量應(yīng)該是一個(gè)漏斗的形式。比如我們的日活用戶 DAU 有 20 萬,實(shí)際可能每天來到提單頁(yè)的用戶只有 3 萬  QPS,最終轉(zhuǎn)化到下單支付成功的 QPS 只有 1 萬。

那么對(duì)于系統(tǒng)來說讀是大于寫的,這時(shí)候可以通過讀寫分離的方式來降低數(shù)據(jù)庫(kù)的壓力。

高并發(fā)的系統(tǒng)是怎樣的

讀寫分離也就相當(dāng)于數(shù)據(jù)庫(kù)集群的方式降低了單節(jié)點(diǎn)的壓力。而面對(duì)數(shù)據(jù)的急劇增長(zhǎng),原來的單庫(kù)單表的存儲(chǔ)方式已經(jīng)無法支撐整個(gè)業(yè)務(wù)的發(fā)展,這時(shí)候就需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行分庫(kù)分表了。

針對(duì)微服務(wù)而言垂直的分庫(kù)本身已經(jīng)是做過的,剩下大部分都是分表的方案了。

水平分表

首先根據(jù)業(yè)務(wù)場(chǎng)景來決定使用什么字段作為分表字段(sharding_key),比如我們現(xiàn)在日訂單 1000 萬,我們大部分的場(chǎng)景來源于 C 端,我們可以用  user_id 作為 sharding_key。

數(shù)據(jù)查詢支持到最近 3 個(gè)月的訂單,超過 3 個(gè)月的做歸檔處理,那么 3 個(gè)月的數(shù)據(jù)量就是 9 億,可以分 1024 張表,那么每張表的數(shù)據(jù)大概就在  100 萬左右。

比如用戶 id 為 100,那我們都經(jīng)過 hash(100),然后對(duì) 1024 取模,就可以落到對(duì)應(yīng)的表上了。

分表后的 ID 唯一性

因?yàn)槲覀冎麈I默認(rèn)都是自增的,那么分表之后的主鍵在不同表就肯定會(huì)有沖突了。

有幾個(gè)辦法考慮:

  • 設(shè)定步長(zhǎng),比如 1-1024 張表我們分別設(shè)定 1-1024 的基礎(chǔ)步長(zhǎng),這樣主鍵落到不同的表就不會(huì)沖突了。

  • 分布式 ID,自己實(shí)現(xiàn)一套分布式 ID 生成算法或者使用開源的比如雪花算法這種。

  • 分表后不使用主鍵作為查詢依據(jù),而是每張表單獨(dú)新增一個(gè)字段作為唯一主鍵使用,比如訂單表訂單號(hào)是唯一的,不管最終落在哪張表都基于訂單號(hào)作為查詢依據(jù),更新也一樣。

主從同步原理

主從同步原理如下:

  • master 提交完事務(wù)后,寫入 binlog。

  • slave 連接到 master,獲取 binlog。

  • master 創(chuàng)建 dump 線程,推送 binglog 到 slave。

  • slave 啟動(dòng)一個(gè) IO 線程讀取同步過來的 master 的 binlog,記錄到 relay log 中繼日志中。

  • slave 再開啟一個(gè) sql 線程讀取 relay log 事件并在 slave 執(zhí)行,完成同步。

  • slave 記錄自己的 binglog。

高并發(fā)的系統(tǒng)是怎樣的

由于 MySQL  默認(rèn)的復(fù)制方式是異步的,主庫(kù)把日志發(fā)送給從庫(kù)后不關(guān)心從庫(kù)是否已經(jīng)處理,這樣會(huì)產(chǎn)生一個(gè)問題就是假設(shè)主庫(kù)掛了,從庫(kù)處理失敗了,這時(shí)候從庫(kù)升為主庫(kù)后,日志就丟失了。由此產(chǎn)生兩個(gè)概念。

①全同步復(fù)制

主庫(kù)寫入 binlog 后強(qiáng)制同步日志到從庫(kù),所有的從庫(kù)都執(zhí)行完成后才返回給客戶端,但是很顯然這個(gè)方式的話性能會(huì)受到嚴(yán)重影響。

②半同步復(fù)制

和全同步不同的是,半同步復(fù)制的邏輯是這樣,從庫(kù)寫入日志成功后返回 ACK 確認(rèn)給主庫(kù),主庫(kù)收到至少一個(gè)從庫(kù)的確認(rèn)就認(rèn)為寫操作完成。

緩存

緩存作為高性能的代表,在某些特殊業(yè)務(wù)可能承擔(dān) 90% 以上的熱點(diǎn)流量。

對(duì)于一些活動(dòng)比如秒殺這種并發(fā) QPS 可能幾十萬的場(chǎng)景,引入緩存事先預(yù)熱可以大幅降低對(duì)數(shù)據(jù)庫(kù)的壓力,10 萬的 QPS  對(duì)于單機(jī)的數(shù)據(jù)庫(kù)來說可能就掛了,但是對(duì)于如 Redis 這樣的緩存來說就完全不是問題。

高并發(fā)的系統(tǒng)是怎樣的

以秒殺系統(tǒng)舉例,活動(dòng)預(yù)熱商品信息可以提前緩存提供查詢服務(wù),活動(dòng)庫(kù)存數(shù)據(jù)可以提前緩存,下單流程可以完全走緩存扣減,秒殺結(jié)束后再異步寫入數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)承擔(dān)的壓力就小的太多了。

當(dāng)然,引入緩存之后就還要考慮緩存擊穿、雪崩、熱點(diǎn)一系列的問題了。

熱 Key 問題

所謂熱 key 問題就是,突然有幾十萬的請(qǐng)求去訪問 redis 上的某個(gè)特定 key,那么這樣會(huì)造成流量過于集中,達(dá)到物理網(wǎng)卡上限,從而導(dǎo)致這臺(tái)  redis 的服務(wù)器宕機(jī)引發(fā)雪崩。

高并發(fā)的系統(tǒng)是怎樣的

針對(duì)熱 key 的解決方案:

  • 提前把熱 key 打散到不同的服務(wù)器,降低壓力。

  • 加入二級(jí)緩存,提前加載熱 key 數(shù)據(jù)到內(nèi)存中,如果 redis 宕機(jī),走內(nèi)存查詢。

緩存擊穿

緩存擊穿的概念就是單個(gè) key 并發(fā)訪問過高,過期時(shí)導(dǎo)致所有請(qǐng)求直接打到 DB 上,這個(gè)和熱 key 的問題比較類似,只是說的點(diǎn)在于過期導(dǎo)致請(qǐng)求全部打到  DB 上而已。

解決方案:

  • 加鎖更新,比如請(qǐng)求查詢 A,發(fā)現(xiàn)緩存中沒有,對(duì) A 這個(gè) key  加鎖,同時(shí)去數(shù)據(jù)庫(kù)查詢數(shù)據(jù),寫入緩存,再返回給用戶,這樣后面的請(qǐng)求就可以從緩存中拿到數(shù)據(jù)了。

  • 將過期時(shí)間組合寫在 value 中,通過異步的方式不斷的刷新過期時(shí)間,防止此類現(xiàn)象。

高并發(fā)的系統(tǒng)是怎樣的

緩存穿透

緩存穿透是指查詢不存在緩存中的數(shù)據(jù),每次請(qǐng)求都會(huì)打到DB,就像緩存不存在一樣。

高并發(fā)的系統(tǒng)是怎樣的

針對(duì)這個(gè)問題,加一層布隆過濾器。布隆過濾器的原理是在你存入數(shù)據(jù)的時(shí)候,會(huì)通過散列函數(shù)將它映射為一個(gè)位數(shù)組中的 K 個(gè)點(diǎn),同時(shí)把他們置為 1。

這樣當(dāng)用戶再次來查詢 A,而 A 在布隆過濾器值為 0,直接返回,就不會(huì)產(chǎn)生擊穿請(qǐng)求打到 DB 了。

顯然,使用布隆過濾器之后會(huì)有一個(gè)問題就是誤判,因?yàn)樗旧硎且粋€(gè)數(shù)組,可能會(huì)有多個(gè)值落到同一個(gè)位置,那么理論上來說只要我們的數(shù)組長(zhǎng)度夠長(zhǎng),誤判的概率就會(huì)越低,這種問題就根據(jù)實(shí)際情況來就好了。

高并發(fā)的系統(tǒng)是怎樣的

緩存雪崩

當(dāng)某一時(shí)刻發(fā)生大規(guī)模的緩存失效的情況,比如你的緩存服務(wù)宕機(jī)了,會(huì)有大量的請(qǐng)求進(jìn)來直接打到 DB上,這樣可能導(dǎo)致整個(gè)系統(tǒng)的崩潰,稱為雪崩。

雪崩和擊穿、熱 key 的問題不太一樣的是,他是指大規(guī)模的緩存都過期失效了。

高并發(fā)的系統(tǒng)是怎樣的

針對(duì)雪崩幾個(gè)解決方案:

針對(duì)不同key設(shè)置不同的過期時(shí)間,避免同時(shí)過期

限流,如果redis宕機(jī),可以限流,避免同時(shí)刻大量請(qǐng)求打崩DB

二級(jí)緩存,同熱key的方案。

穩(wěn)定性

高并發(fā)的系統(tǒng)是怎樣的

熔斷:比如營(yíng)銷服務(wù)掛了或者接口大量超時(shí)的異常情況,不能影響下單的主鏈路,涉及到積分的扣減一些操作可以在事后做補(bǔ)救。

限流:對(duì)突發(fā)如大促秒殺類的高并發(fā),如果一些接口不做限流處理,可能直接就把服務(wù)打掛了,針對(duì)每個(gè)接口的壓測(cè)性能的評(píng)估做出合適的限流尤為重要。

降級(jí):熔斷之后實(shí)際上可以說就是降級(jí)的一種,以熔斷的舉例來說營(yíng)銷接口熔斷之后降級(jí)方案就是短時(shí)間內(nèi)不再調(diào)用營(yíng)銷的服務(wù),等到營(yíng)銷恢復(fù)之后再調(diào)用。

預(yù)案:一般來說,就算是有統(tǒng)一配置中心,在業(yè)務(wù)的高峰期也是不允許做出任何的變更的,但是通過配置合理的預(yù)案可以在緊急的時(shí)候做一些修改。

核對(duì):針對(duì)各種分布式系統(tǒng)產(chǎn)生的分布式事務(wù)一致性或者受到攻擊導(dǎo)致的數(shù)據(jù)異常,非常需要核對(duì)平臺(tái)來做最后的兜底的數(shù)據(jù)驗(yàn)證。

比如下游支付系統(tǒng)和訂單系統(tǒng)的金額做核對(duì)是否正確,如果收到中間人攻擊落庫(kù)的數(shù)據(jù)是否保證正確性。

感謝各位的閱讀,以上就是“高并發(fā)的系統(tǒng)是怎樣的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)高并發(fā)的系統(tǒng)是怎樣的這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI