大話程式猿眼裡的高併發(上)

2022-07-21 07:24:09 字數 2754 閱讀 6277

高併發是指在同乙個時間點,有很多使用者同時的訪問url位址,比如:**的雙11,雙12,就會產生高併發,如貼吧的爆吧,就是惡意的高併發請求,也就是ddos攻擊,再屌絲點的說法就像玩擼啊擼被adc暴擊了一樣,那傷害你懂得(如果你看懂了,這個說法說明是正在奔向人生巔峰的屌絲。

高併發會來帶的後果

導致站點伺服器/db伺服器資源被佔滿崩潰,資料的儲存和更新結果和理想的設計是不一樣的,比如:出現重複的資料記錄,多次新增了使用者積分等。

尼瑪,這麼卡,老子來參加活動的,重新整理了還是這樣,垃圾**,再也不來了。

在做公司產品**的過程中,經常會有這樣的需求,比如什麼搞個活動專題,**,簽到,搞個積分競拍等等,如果沒有考慮到高併發下的資料處理,那就game over了,很容易導致**被多抽走,簽到會發現乙個使用者有多條記錄,簽到一次獲得了獲得了多積分,等等,各種超出正常邏輯的現象,這就是做產品**必須考慮的問題,因為這些都是面向大量使用者的,而不是像做erp管理系統,oa系統那樣,只是面向員工。

併發下的資料處理

通過表設計,如:記錄表新增唯一約束,資料處理邏輯使用事物防止併發下的資料錯亂問題

通過服務端鎖程序防止包併發下的資料錯亂問題

這裡主要講述的是在併發請求下的資料邏輯處理的介面,如何保證資料的一致性和完整性,這裡的併發可能是大量使用者發起的,也可能攻擊者通過併發工具發起的併發請求

如例子:通過表設計防止併發導致資料錯亂

【簽到功能】 一天乙個使用者只能簽到一次,

簽到成功後使用者獲取到乙個積分

使用者表,包含積分字段

高併發意淫分析(屬於開發前的猜測):

在高併發的情況下,會導致,乙個使用者簽到記錄會有多條,或者使用者簽到後不止加一積分。

首先根據需求我會新增一張簽到記錄表,重點來了,這張表需要把使用者唯一標識字段(id,token)和簽到日期字段新增為唯一約束,或者唯一索引,這樣就可以防止併發的時候插入重複使用者的簽到記錄。然後再程式**邏輯裡,先執行簽到資料的新增(這裡可以防止併發,新增成功後再進行積分的新增,這樣就可以防止重複的新增積分了。最後我還是建議所有的資料操作都寫在乙個sql事務裡面, 這樣在新增失敗,或者編輯使用者積分失敗的時候可以回滾資料。

如例子2(事務+通過更新鎖 防止併發導致資料錯亂 或者事物+update的鎖表機制)

【**功能】 **一次消耗乙個積分 **中獎後編輯剩餘獎品總數 剩餘獎品總數為0,或者使用者積分為0的時候無法進行**

使用者表,包含積分字段 獎品表,包含獎品剩餘數量字段

高併發意淫分析(屬於開發前的猜測):

在高併發的情況下,會導致使用者參與**的時候積分被扣除,而獎品實際上已經被抽完了

在事物裡,通過with (updlock) 鎖住商品表,或者update 表的獎品剩餘數量和最後編輯時間字段,來把資料行鎖住,然後進行使用者積分的消耗,都完成後提交事物,失敗就回滾。 這樣就可以保證,只有可能存在乙個操作在操作這件商品的數量,只有等到這個操作事物提交後,其他的操作這個商品行的事物才會繼續執行。

如例子3(通過程式**防止包併發下的資料錯亂問題)

【快取資料到cache裡】, 當快取不存在的時候,從資料庫中獲取並儲存在cache裡,如果存在從cache裡獲取,每天10點必須更新一次,其他時間點快取兩個小時更新一次 到10點的時候,凡是開啟頁面的使用者會自動重新整理頁面

這裡有個邏輯使用者觸發快取的更新,使用者重新整理頁面,當快取存在的時候,會取到最後一次快取更新時間,如果當前時間大於十點,並且最後快取時間是10點前,則會從資料庫中重新獲取資料儲存到cache中。 還有客戶端頁面會在10點時候用js發起頁面的重新整理,就是因為有這樣的邏輯,導致10點的時候有很多併發請求同時過來,然後就會導致很多的sql查詢操作,理想的邏輯是,只有乙個請求會去資料庫獲取,其他都是從快取中獲取資料。(因為這個sql查詢很耗伺服器效能,所以導致在10點的時候,突然間資料庫伺服器壓力暴增)

c#通過 (鎖)lock,在從資料讀取到快取的那段**前面加上鎖,這樣在併發的情況下只會有乙個請求是從資料庫裡獲取資料,其他都是從快取中獲取。

訪問量大的資料統計介面

這介面是給前端ajax使用,訪問量會很大,一頁面展示的時候就會有幾十件商品的展示,滾動條滾到到頁面顯示商品的時候就會請求介面進行展示資料的統計,每次翻頁又會載入幾十件

我們通過nodejs寫了乙個資料處理介面,把統計資料先存到redis的list裡。(使用nodejs寫介面的好處是,nodejs使用單執行緒非同步事件機制,高併發處理能力強,不會因為資料邏輯處理問題導致伺服器資源被占用而導致伺服器宕機) 然後再使用nodejs寫了乙個指令碼,指令碼功能就是從redis裡出列資料儲存到mysql資料庫中。這個指令碼會一直執行,當redis沒有資料需要同步到資料庫中的時候,sleep,讓在進行資料同步操作

高併發的下的伺服器壓力均衡,合理站點架設,db部署

以下我所知道的:

伺服器**nginx,做伺服器的均衡負載,把壓力均衡到多台伺服器

部署集群 mysql資料庫, redis伺服器,或者mongodb伺服器,把一些常用的查詢資料,並且不會經常的變化的資料儲存到其他nosql db伺服器中,來減少資料庫伺服器的壓力,加快資料的響應速度。

資料快取,cache

在高併發介面的設計中可以使用具有高併發能力的程式語言去開發,如:nodejs 做web介面

伺服器部署,伺服器分離,靜態檔案走cdn

dba資料庫的優化查詢條件,索引優化

訊息儲存機制,將資料新增到資訊佇列中(redis list),然後再寫工具去入庫

指令碼合理控制請求,如,防止使用者重複點選導致的ajax多餘的請求,等等。

併發測試神器推薦

大話程式猿眼裡的高併發

將不進行維護,轉站到我的個人博文 位址 大話程式猿眼裡的高併發 簡單理解下高併發 高併發是指在同乙個時間點,有很多使用者同時的訪問url位址,比如 的雙11,雙12,就會產生高併發,如貼吧的爆吧,就是惡意的高併發請求,也就是ddos攻擊,再屌絲點的說法就像玩擼啊擼被adc暴擊了一樣,那傷害你懂得 如...

大話程式猿眼裡的高併發

高併發是指在同乙個時間點,有很多使用者同時的訪問url位址,比如 的雙11,雙12,就會產生高併發,如貼吧的爆吧,就是惡意的高併發請求,也就是ddos攻擊,再屌絲點的說法就像玩擼啊擼被adc暴擊了一樣,那傷害你懂得 如果你看懂了,這個說法說明是正在奔向人生巔峰的屌絲。使用者角度 我的經歷 在做公司產...

程式猿眼裡的專案經理

十月份的目標面談中,我的領導問我,你覺得專案經理應該具備什麼樣的素質和技能,是乙個怎樣的人。本來只是乙個破冰的提問,沒有想到這個簡單的開放式的問題便把我這個pmper給問倒了。於是帶著這個問題,我翻開了書架上積滿灰塵的pmbok。在pmbok中給出的官方的定義如下 在pmbok第六版中,使用了專門乙...