成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

雙宋離婚,冰冰分手,最慌的是程序員!

新聞
6 月 27 日,微博再次宕機,因為一連出現 3 個熱點新聞:雙宋離婚、寶強母親去世、李晨范冰冰分手。廣大網友可能更多關注的是新聞本身,紛紛留言評論發表自己看法。

6 月 27 日,微博再次宕機,因為一連出現 3 個熱點新聞:雙宋離婚、寶強母親去世、李晨范冰冰分手。廣大網友可能更多關注的是新聞本身,紛紛留言評論發表自己看法。

[[269233]]

而站在一個程序員的角度,出于職業習慣,首先想到的卻是自己的后臺架構,應該如何抗住一天 3 個熱點涌入的巨大流量!

為什么要用緩存集群

其實使用緩存集群的時候,最怕的就是熱 Key、大 Value 這兩種情況,那啥叫熱 Key 大 Value 呢?

簡單來說,熱 Key,就是你的緩存集群中的某個 Key 瞬間被數萬甚至十萬的并發請求打爆。

大 Value,就是你的某個 Key 對應的 Value 可能有 GB 級的大小,導致查詢 Value 的時候出現網絡相關的故障問題。

我們先來看看下面一幅圖,假設你手頭有個系統,他本身是集群部署的,然后后面有一套緩存集群,這個集群不管你用 Redis Cluster,還是 Memcached,或者是公司自研緩存集群,都可以。

那么,這套系統用緩存集群干什么呢?很簡單,在緩存里放一些平時不怎么變動的數據,然后用戶在查詢大量的平時不怎么變動的數據的時候,不就可以直接從緩存里走了嗎?

緩存集群的并發能力是很強的,而且讀緩存的性能是很高的。舉個例子,假設你每秒有 2 萬請求,但是其中 90% 都是讀請求,那么每秒 1.8 萬請求都是在讀一些不太變化的數據,而不是寫數據。

那此時你把這些數據都放在數據庫里,然后每秒發送 2 萬請求到數據庫上讀寫數據,你覺得合適嗎?

當然不合適了,如果你要用數據庫承載每秒 2 萬請求的話,那么不好意思,你很可能就得搞分庫分表+讀寫分離。

比如你得分 3 個主庫,承載每秒 2000 的寫入請求,然后每個主庫掛 3 個從庫,一共 9 個從庫承載每秒 1.8 萬的讀請求。

這樣的話,你可能就需要一共是 12 臺高配置的數據庫服務器,這是很耗費錢的,成本非常高,很不合適。

大家看看下面的圖,來體會下這種情況:

因此,我們完全可以把平時不太變化的數據放在緩存集群里,緩存集群可以采用 2 主 2 從,主節點用來寫入緩存,從節點用來讀緩存。

以緩存集群的性能,2 個從節點完全可以用來承載每秒 1.8 萬的大量讀請求,然后 3 個數據庫主庫承載每秒 2000 的寫請求和少量其他讀請求就 OK 了。

這樣一來,你耗費的機器瞬間變成了 4 臺緩存機器+3 臺數據庫機器=7 臺機器,是不是比之前的 12 臺機器減少了很大的資源開銷?

沒錯,緩存在系統架構里是非常重要的組成部分。很多時候,對于那些很少變化但是大量高并發讀的數據,通過緩存集群來抗高并發讀,是非常合適的。

我們看看下面的圖,體會一下這個過程:

需要說明的是,這里所有的機器數量、并發請求量都是一個示例,大家主要是體會一下這個意思就好。

其目的主要是給一些不太熟悉緩存相關技術的同學一點背景性的闡述,讓這些同學能夠理解在系統里用緩存集群承載讀請求是什么意思。

20 萬用戶同時訪問一個熱點緩存

好了,背景已經給大家解釋清楚,現在就可以給大家說說今天重點要討論的問題:熱點緩存。

我們來做一個假設,現在有 10 個緩存節點來抗大量的讀請求。正常情況下,讀請求應該是均勻的落在 10 個緩存節點上的,對吧!

這 10 個緩存節點,每秒承載 1 萬請求是差不多的。

然后我們再做一個假設,你一個節點承載 2 萬請求是極限,所以一般你就限制一個節點正常承載 1 萬請求就 OK 了,稍微留一點 Buffer 出來。

好,所謂的熱點緩存問題是什么意思呢?很簡單,就是突然因為莫名的原因,出現大量的用戶訪問同一條緩存數據。

比如像昨天那樣,雙宋離婚、寶強母親去世、李晨范冰冰分手,這是不是會引發短時間內每秒有數十萬用戶去查看這幾條熱點新聞?

假設上述 3 條新聞就是 3 個緩存,對應 3 個緩存 Key,這些 Key 都存在于一臺緩存機器上。

然后某條新聞一公布,比如范冰冰一發布微博,接著瞬間就可能幾十萬請求奔向那一臺機器。

此時會如何?我們看看下面的圖,來體會一下這種絕望的感受:

很明顯了,我們剛才假設的是一個緩存 Slave 節點最多每秒就是 2 萬的請求,當然實際緩存單機承載 5 萬~10 萬讀請求也是可能的,這里就是一個假設。

結果每秒突然奔過來 20 萬請求到這臺機器上,會怎么樣?很簡單,上面圖里那臺被 20 萬請求指向的緩存機器會過度操勞而宕機的。

那么如果緩存集群開始出現機器的宕機,此時會如何?此時讀請求發現讀不到數據,會從數據庫里提取原始數據,然后放入剩余的其他緩存機器里去。

但是接踵而來的每秒 20 萬請求,會再次壓垮其他的緩存機器。以此類推,最終導致緩存集群全盤崩潰,引發系統整體宕機。

咱們看看下面的圖,再感受一下這個恐怖的現場:

基于流式計算技術的緩存熱點自動發現

其實這里關鍵的一點,就是對于這種熱點緩存,你的系統需要能夠在熱點緩存突然發生的時候,直接發現他,然后瞬間立馬實現毫秒級的自動負載均衡。

那么我們就先來說說,你如何自動發現熱點緩存問題?首先你要知道,一般出現緩存熱點的時候,你的每秒并發肯定是很高的,可能每秒都幾十萬甚至上百萬的請求量過來,這都是有可能的。

所以,此時完全可以基于大數據領域的流式計算技術來進行實時數據訪問次數的統計,比如 Storm、Spark Streaming、Flink。

一旦在實時數據訪問次數統計的過程中,比如發現 1 秒之內,某條數據突然訪問次數超過了 1000,就直接立馬把這條數據判定為是熱點數據,可以將這個發現出來的熱點數據寫入比如 Zookeeper 中。

當然,你的系統如何判定熱點數據,可以根據自己的業務還有經驗值來就可以了。

大家看看下面這張圖,看看整個流程是如何進行的:

這里肯定有人會問,那你的流式計算系統在進行數據訪問次數統計的時候,會不會也存在說單臺機器被請求每秒幾十萬次的問題呢?

答案是:否。因為流式計算技術,尤其是 Storm 這種系統,他可以做到同一條數據的請求過來,先分散在很多機器里進行本地計算,***再匯總局部計算結果到一臺機器進行全局匯總。

所以幾十萬請求可以先分散在比如 100 臺機器上,每臺機器統計了這條數據的幾千次請求。

然后 100 條局部計算好的結果匯總到一臺機器做全局計算即可,所以基于流式計算技術來進行統計是不會有熱點問題的。

熱點緩存自動加載為 JVM 本地緩存

我們自己的系統可以對 Zookeeper 指定的熱點緩存對應的 Znode 進行監聽,如果有變化他立馬就可以感知到了。

此時系統層就可以立馬把相關的緩存數據從數據庫加載出來,然后直接放在自己系統內部的本地緩存里即可。

這個本地緩存,你用 Ehcache、Hashmap,其實都可以,一切看自己的業務需求。

我們這里主要說的就是將緩存集群里的集中式緩存,直接變成每個系統自己本地實現緩存即可,每個系統本地是無法緩存過多數據的。

因為一般這種普通系統單實例部署機器可能就一個 4 核 8G 的機器,留給本地緩存的空間是很少的,所以用來放這種熱點數據的本地緩存是最合適的,剛剛好。

假設你的系統層集群部署了 100 臺機器,那么好了,此時你 100 臺機器瞬間在本地都會有一份熱點緩存的副本。

然后接下來對熱點緩存的讀操作,直接系統本地緩存讀出來就給返回了,不用再走緩存集群了。

這樣的話,也不可能允許每秒 20 萬的讀請求到達緩存機器的一臺機器上讀一個熱點緩存了,而是變成 100 臺機器每臺機器承載數千請求,那么那數千請求就直接從機器本地緩存返回數據了,這是沒有問題的。

我們再來畫一幅圖,一起來看看這個過程:

限流熔斷保護

除此之外,在每個系統內部,其實還應該專門加一個對熱點數據訪問的限流熔斷保護措施。

每個系統實例內部,都可以加一個熔斷保護機制,假設緩存集群最多每秒承載 4 萬讀請求,那么你一共有 100 個系統實例。

你自己就該限制好,每個系統實例每秒最多請求緩存集群讀操作不超過 400 次,一超過就可以熔斷掉,不讓請求緩存集群,直接返回一個空白信息,然后用戶稍后會自行再次重新刷新頁面之類的。

通過系統層自己直接加限流熔斷保護措施,可以很好的保護后面的緩存集群、數據庫集群之類的不要被打死。

再來一幅圖,一起來看看:

總結

具體要不要在系統里實現這種復雜的緩存熱點優化架構呢?這個還要看你們自己的系統有沒有這種場景了。

如果你的系統有熱點緩存問題,那么就要實現類似本文的復雜熱點緩存支撐架構。

但是如果沒有的話,那么也別過度設計,其實你的系統可能根本不需要這么復雜的架構。

如果是后者,那么大伙兒就權當看看本文,了解一下對應的架構思想好了!

中華石杉:十余年 BAT 架構經驗,一線互聯網公司技術總監。帶領上百人團隊開發過多個億級流量高并發系統。現將多年工作中積累下的研究手稿、經驗總結整理成文,傾囊相授。微信公眾號:石杉的架構筆記(ID:shishan100)。

 

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2017-12-04 23:25:24

2016-03-25 11:57:23

Java程序員C++

2012-07-18 10:35:22

GitHub程序員代碼

2018-07-16 09:12:00

程序員奇葩開發

2013-11-01 17:24:39

程序員命名

2015-04-10 19:37:34

程序員

2015-12-04 08:49:00

程序員夢魘

2011-09-15 09:12:00

程序員蘋果

2015-12-07 10:09:40

程序員噩夢

2014-11-26 09:45:48

程序員

2017-09-11 18:37:00

2013-06-17 11:01:49

程序員離職

2019-04-10 16:17:02

程序員結構源代碼

2021-02-20 13:55:35

程序員計算機技術

2013-08-20 09:33:59

程序員

2014-12-22 10:07:10

程序員

2012-11-14 14:18:57

程序員

2018-08-10 14:35:42

程序員技術代碼

2009-11-23 15:22:16

2015-02-03 02:40:33

程序員盲人程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人免费一区二区60岁 | 操久久 | 一级毛片观看 | 久久久久久国产免费视网址 | 97caoporn国产免费人人 | 国产一区久久久 | 国产精品一二三区 | 激情小视频 | 天天舔天天 | 欧美看片 | www.玖玖玖 | 欧美精品在线免费 | 国产精品一区二区视频 | 欧美老少妇一级特黄一片 | 国产精品a久久久久 | 欧美午夜一区二区三区免费大片 | 日韩av大片免费看 | 国产欧美精品一区 | 日韩成人免费视频 | 日日噜噜噜夜夜爽爽狠狠视频, | 日韩欧美成人一区二区三区 | 午夜日韩| 色婷婷av一区二区三区软件 | 精精精精xxxx免费视频 | 精品国产伦一区二区三区观看方式 | 国产一级久久久久 | www.久| 久99久视频 | 精品欧美一区二区三区久久久 | 亚洲综合一区二区三区 | 91视频免费在观看 | 免费一级黄色电影 | 亚洲精品一| 午夜视频精品 | 黄色大片免费观看 | 国产精品欧美一区二区三区不卡 | 国产久 | 亚洲欧美日韩久久久 | 国产精品久久久久久久久免费 | 中文在线a在线 | 亚洲国产精品一区二区三区 |