高併發系統設計的 2 個要點,一定要看!

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

在系統設計時,如果能預先看到一些問題,並在設計層面提前解決,就會給後期的開發帶來很大的便捷。

一、Session共享問題

單系統中的Session對象可以直接保存在內存中,但在分佈式或集羣環境下,多個不同的節點就要採取措施來共享Session對象,具體可以使用以下幾種方式。

1.Session Replication

Session Replication 是指在客戶端第一次發出請求後,處理該請求的服務端就會創建一個與之對應的Session對象,用於保存客戶端的狀態信息,之後爲了讓其他服務端也能保存一份此Session對象,就需要將此Session對象在各個服務端節點之間進行同步,如圖1所示。

DF621C92_1717_46bb_9FA0_5B3D9CDBA6DA

2.Session Sticky

Session Sticky是通過Nginx等負載均衡工具對各個用戶進行標記(例如對Cookie標記),使每個用戶在經過負載均衡工具後都請求固定的服務節點,如圖2所示。

055C73BF_62A1_4b3f_BDA6_2DC862E8F7E2

3.獨立Session服務器

可以將系統中所有的Session對象都存放到一個獨立的Session服務中,之後各個應用服務再分別從這個Session服務中獲取需要的Session對象,如圖3所示。在大規模分佈式系統中,就推薦使用這種獨立Session服務方式。並且這種方式在存儲Session對象時,既可以用數據庫,也可以使用各種分佈式或集羣存儲系統。

6B85BBA2_8524_4cd0_BE3B_92D74AB66E7B

二、緩存穿透與緩存雪崩問題

緩存可以在一定程度上緩解高併發造成的性能問題,但在一些特定場景下緩存自身也會帶來一些問題,比較典型的就是緩存穿透與緩存雪崩問題。

1.緩存穿透

緩存穿透是指大量查詢一些數據庫中不存在的數據,從而影響數據庫的性能。例如Redis等KV存儲結構的中間件可以作爲MySQL等數據庫的緩存組件,但如果某些數據沒有被Redis緩存卻被大量的查詢,就會對MySQL帶來巨大壓力,如圖4所示。

CEBC1C29_4ACF_48e1_9475_238088F7A554

理解了緩存穿透的原因後,解決思路就已經明確了,舉例如下。

1)攔截非法的查詢請求,僅將合理的請求發送給MySQL。

如,可以使用驗證碼、IP限制等手段限制惡意攻擊,並用敏感詞過濾器等攔截不合理的非法查詢。

2)緩存空對象。

如,假設在iphone9上市後,可能會導致大量用戶搜索iphone9,但此時Redis和MySQL中還沒有iphone9這個詞。將數據庫中不存在的iphone9也緩存在Redis中,如Key=iphone9,value=””。之後當用戶再次搜索iphone9時,就可以直接從Redis中拿到結果,從而避免對MySQL的訪問,如圖5所示。

D5B5B549_6689_4cf8_B362_E6908AFB9C2A

提示:爲了減少Redis對大量空對象的緩存,可以適當減少空對象的過期時間。

3)建立數據標識倉庫。

將MySQL中的所有數據的name值都映射成hash值,例如可以將“商品表”中的商品名“iphone8”映射成MD5計算出來的hash值,然後再將全部name的hash值放入Redis中,從而構建出一個“數據庫中所有可查數據的hash倉庫”。

之後,每次在查詢MySQL之前都會先查詢這個hash倉庫,如果要查詢數據的hash值存在於倉庫中,再進入MySQL做真實的查詢,如果不存在則直接返回。需要注意的是,由於不同數據的hash值在概率上時可能相同的,因此可能會漏掉對個別數據的攔截,如圖6中的“B”。

62A4D037_1041_47c3_99DB_DBCD65B06D98

2.緩存雪崩

除了緩存穿透以外,在使用緩存時還需要考慮緩存雪崩的情況。緩存雪崩是指由於某種原因造成Redis突然失效,從而造成MySQL瞬間壓力驟增,進而嚴重影響MySQL性能甚至造成MySQL服務宕機。
可參考使用以下解決方案:
1)搭建Redis集羣,保證高可用;
2)避免大量緩存對象的key集中失效,盡力讓過期時間分配均勻一些,例如,可以給各個緩存的過期時間乘一個隨機數;
3)通過隊列、鎖機制等控制併發訪問MySQL的線程數。

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/zhibo

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-07-28
本文作者:互聯網架構師
本文來自:“互聯網架構師”,瞭解相關信息可以關注“互聯網架構師

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章