Java多線程與高并發(fā):高并發(fā)解決思路

來源:http://www.wangtianyi.top/blog/2018/05/11/javaduo-xian-cheng-yu-gao-bing-fa-liu-gao-bing-fa-jie-jue-si-lu/

緩存并發(fā)

image.png

當大量請求訪問同一個沒有被緩存的數據的時候偏形,會發(fā)送大量請求給數據庫纷妆,導致數據庫壓力過大沮榜,還會導致一致性問題,所以解決方式就是在緩存獲取的時候加上針對單個數據的鎖戈二,直到緩存被重建成功得到最新數據

緩存擊穿/穿透

image.png

查詢一個數據庫中不存在的數據,比如商品詳情另锋,查詢一個不存在的ID待德,每次都會訪問DB俊柔,如果有人惡意破壞筹麸,很可能直接對DB造成過大地壓力。

解決方案:

當通過某一個key去查詢數據的時候雏婶,如果對應在數據庫中的數據都不存在物赶,我們將此key對應的value設置為一個默認的值。

緩存失效

在高并發(fā)的環(huán)境下留晚,如果此時key對應的緩存失效酵紫,此時有多個進程就會去同時去查詢DB,然后再去同時設置緩存倔丈。這個時候如果這個key是系統(tǒng)中的熱點key或者同時失效的數量比較多時憨闰,DB訪問量會瞬間增大状蜗,造成過大的壓力需五。

解決方案:

  • 將系統(tǒng)中key的緩存失效時間均勻地錯開。
  • 當我們通過key去查詢數據時轧坎,首先查詢緩存宏邮,如果此時緩存中查詢不到,就通過分布式鎖進行加鎖缸血。

熱點key

緩存中的某些Key(可能對應用與某個促銷商品)對應的value存儲在集群中一臺機器蜜氨,使得所有流量涌向同一機器,成為系統(tǒng)的瓶頸捎泻,該問題的挑戰(zhàn)在于它無法通過增加機器容量來解決飒炎。
解決方案:

  • 客戶端熱點key緩存:將熱點key對應value并緩存在客戶端本地,并且設置一個失效時間笆豁。
  • 將熱點key分散為多個子key郎汪,然后存儲到緩存集群的不同機器上赤赊,這些子key對應的value都和熱點key是一樣的。

消息隊列

消息隊列是為了解決生產和消費的速度不一致導致的問題煞赢,有以下好處:

  1. 減少請求響應時間抛计。比如注冊功能需要調用第三方接口來發(fā)短信,如果等待第三方響應可能會需要很多時間
  2. 服務之間解耦吹截。主服務只關心核心的流程波俄,其他不重要的弟断、耗費時間流程是否如何處理完成不需要知道阀趴,只通知即可
  3. 流量削鋒苍匆。對于不需要實時處理的請求來說,當并發(fā)量特別大的時候浸踩,可以先在消息隊列中作緩存,然后陸續(xù)發(fā)送給對應的服務去處理

如果想要實現一個消息隊列据块,可以參考這里
最簡單的消息隊列就是一個消息轉發(fā)器折剃,基本功能只有三個:消息存儲边篮、消息發(fā)送奏甫、消息刪除思杯,可使用LinkedBlockingQueue挠进、ConcurrentLinkedQueue實現

應用拆分

之前翻譯過的一篇博文已經提到色乾,如何將已經存在的巨無霸單體應用重構成微服務,點擊上面鏈接即可

限流

image.png

限流是為了解決高并發(fā)情況下漆撞,大量請求導致數據庫或服務器壓力過大出現延遲或出錯的方式悍汛,在圖中,如果一次性將100多萬數據發(fā)送給master庫奉件,那么服務器與數據庫的IO性能將會被大量占用县貌,導致其他服務對數據庫的不可用,master庫還需要很久的時間將數據同步給slave庫

控制某段代碼在一定時間內的執(zhí)行次數,可通過Guava或Semaphore實現

數據庫切庫巷帝、分庫、分表

切庫:數據庫讀寫分離導致的數據庫切換操作

當單個數據庫的讀寫性能達到瓶頸的時候历谍,可根據業(yè)務來判斷讀與寫的比重,然后通過將數據庫設置為Master-Slave模式完成讀寫分離并配置好所有庫的讀寫權限例驹。
當查詢業(yè)務多余讀取業(yè)務的時候瞧预,通過負載均衡,將查詢的操作分擔給不同的從庫垢油,從而減輕主庫的壓力盆驹。
可以通過Spring注解來完成配置

分庫分表

當單庫的性能達到瓶頸,或當單表容量達到瓶頸滩愁,通過SQL與索引的優(yōu)化之后還是很慢躯喇,那么就需要分表
水平分表:表結構保持不變,根據固定的ID將數據劃分到不同表中硝枉,需要在寫入與查詢的時候進行ID的路由
垂直分表:將表結構根據數據的活躍度拆分成多個表廉丽,來分別提高不同的單表處理能力
問題:

  • 事務問題。在執(zhí)行分庫之后妻味,由于數據存儲到了不同的庫上雅倒,數據庫事務管理出現了困難。如果依賴數據庫本身的分布式事務管理功能去執(zhí)行事務弧可,將付出高昂的性能代價蔑匣;如果由應用程序去協助控制,形成程序邏輯上的事務棕诵,又會造成編程方面的負擔裁良。
  • 跨庫跨表的join問題。在執(zhí)行了分庫分表之后校套,難以避免會將原本邏輯關聯性很強的數據劃分到不同的表价脾、不同的庫上,我們無法join位于不同分庫的表笛匙,也無法join分表粒度不同的表侨把,結果原本一次查詢能夠完成的業(yè)務,可能需要多次查詢才能完成妹孙。
  • 額外的數據管理負擔和數據運算壓力秋柄。額外的數據管理負擔,最顯而易見的就是數據的定位問題和數據的增刪改查的重復執(zhí)行問題蠢正,這些都可以通過應用程序解決骇笔,但必然引起額外的邏輯運算。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市笨触,隨后出現的幾起案子懦傍,更是在濱河造成了極大的恐慌,老刑警劉巖芦劣,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粗俱,死亡現場離奇詭異,居然都是意外死亡虚吟,警方通過查閱死者的電腦和手機源梭,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稍味,“玉大人废麻,你說我怎么就攤上這事∧B” “怎么了烛愧?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掂碱。 經常有香客問我怜姿,道長,這世上最難降的妖魔是什么疼燥? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任沧卢,我火速辦了婚禮,結果婚禮上醉者,老公的妹妹穿的比我還像新娘但狭。我一直安慰自己,他們只是感情好撬即,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布立磁。 她就那樣靜靜地躺著,像睡著了一般剥槐。 火紅的嫁衣襯著肌膚如雪唱歧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天粒竖,我揣著相機與錄音颅崩,去河邊找鬼。 笑死蕊苗,一個胖子當著我的面吹牛沿后,可吹牛的內容都是我干的。 我是一名探鬼主播岁歉,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼得运,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锅移?” 一聲冷哼從身側響起熔掺,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎非剃,沒想到半個月后置逻,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡备绽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年券坞,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肺素。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡恨锚,死狀恐怖,靈堂內的尸體忽然破棺而出倍靡,到底是詐尸還是另有隱情猴伶,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布塌西,位于F島的核電站他挎,受9級特大地震影響,放射性物質發(fā)生泄漏捡需。R本人自食惡果不足惜办桨,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望站辉。 院中可真熱鬧呢撞,春花似錦、人聲如沸饰剥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐川。三九已至脓鹃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間古沥,已是汗流浹背瘸右。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岩齿,地道東北人太颤。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像盹沈,于是被迫代替她去往敵國和親龄章。 傳聞我的和親對象是個殘疾皇子吃谣,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345