大話程式猿眼裡的高併發

2022-07-17 06:03:13 字數 3410 閱讀 5034

將不進行維護,轉站到我的個人博文:位址

大話程式猿眼裡的高併發

簡單理解下高併發:

高併發是指在同乙個時間點,有很多使用者同時的訪問url位址,比如:**的雙11,雙12,就會產生高併發,如貼吧的爆吧,就是惡意的高併發請求,也就是ddos攻擊

再屌絲點的說法就像玩擼啊擼被adc暴擊了一樣,那傷害你懂得(如果你看懂了,這個說法說明是正在奔向人生巔峰的屌絲)。

高併發會來帶的後果:

服務端:導致站點伺服器/db伺服器資源被佔滿崩潰,可能產生不是理想中的重複雜亂的資料。

我的經歷:

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

1,高併發的資料處理:

通過表設計或者sql語句來防止包併發下的資料錯亂問題

通過程式**防止包併發下的資料錯亂問題

-------------------------------------------[我只是美麗的分割線]-------------------------------------------

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

需求點:

【簽到功能】

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

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

已知表:

使用者表,包含積分字段

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

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

我的設計:

首先根據需求我會新增一張簽到記錄表,重點來了,這張表需要把使用者唯一標識字段(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,在從資料讀取到快取的那段**前面加上鎖,這樣在併發的情況下只會有乙個請求是從資料庫裡獲取資料,其他都是從快取中獲取。

-------------------------------------------[我只是美麗的分割線]-------------------------------------------

2,訪問量大的資料統計介面:

需求:問題點:

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

意淫分析:

解決問題:

我們通過nodejs寫了乙個資料處理介面,把統計資料先存到redis的list裡。(使用nodejs寫介面的好處是,nodejs使用單執行緒非同步事件機制,高併發處理能力強,不會因為資料邏輯處理問題導致伺服器資源被占用而導致伺服器宕機)

然後再使用nodejs寫了乙個指令碼,指令碼功能就是從redis裡出列資料儲存到mysql資料庫中。這個指令碼會一直執行,當redis沒有資料需要同步到資料庫中的時候,sleep,讓在進行資料同步操作

-------------------------------------------[我只是美麗的分割線]-------------------------------------------

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

以下我所知道的:    

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

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

3,資料快取,cache

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

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

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

4,併發測試神器推薦:

apache jmeter

(如果還有更好的工具求推薦,簡單易用)

大話程式猿眼裡的高併發

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

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

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

程式猿眼裡的專案經理

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