偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

秒殺系統(tǒng)必須考慮的3個技術(shù)問題!

開發(fā) 后端
Java并發(fā)包提供三個常用的并發(fā)隊列實現(xiàn),分別是ArrayBlockingQueue、ConcurrentLinkedQueue和 LinkedBlockingQueue 。在請求預(yù)處理階段,由于我們的系統(tǒng)入隊需求要遠(yuǎn)大于出隊需求,一般不會出現(xiàn)隊空的情況,所以我們可以選擇ConcurrentLinkedQueue來作為我們的請求隊列實現(xiàn)。

[[257613]]

1、并發(fā)隊列的選擇

Java的并發(fā)包提供了三個常用的并發(fā)隊列實現(xiàn),分別是:ArrayBlockingQueue、ConcurrentLinkedQueue 和 LinkedBlockingQueue 。

ArrayBlockingQueue是初始容量固定的阻塞隊列,我們可以用來作為數(shù)據(jù)庫模塊成功競拍的隊列,比如有10個商品,那么我們就設(shè)定一個10大小的數(shù)組隊列。

ConcurrentLinkedQueue使用的是CAS原語無鎖隊列實現(xiàn),是一個異步隊列,入隊的速度很快,出隊進行了加鎖,性能稍慢。

LinkedBlockingQueue也是阻塞的隊列,入隊和出隊都用了加鎖,當(dāng)隊空的時候線程會暫時阻塞。

在請求預(yù)處理階段,由于我們的系統(tǒng)入隊需求要遠(yuǎn)大于出隊需求,一般不會出現(xiàn)隊空的情況,所以我們可以選擇ConcurrentLinkedQueue來作為我們的請求隊列實現(xiàn)。

2、請求接口的合理設(shè)計

一個秒殺或者搶購頁面,通常分為2個部分,一個是靜態(tài)的HTML等內(nèi)容,另一個就是參與秒殺的Web后臺請求接口。

通常靜態(tài)HTML等內(nèi)容,是通過CDN的部署,一般壓力不大,核心瓶頸實際上在后臺請求接口上。這個后端接口,必須能夠支持高并發(fā)請求,同時,非常重要的一點,必須盡可能“快”,在最短的時間里返回用戶的請求結(jié)果。

為了實現(xiàn)盡可能快這一點,接口的后端存儲使用內(nèi)存級別的操作會更好一點。仍然直接面向MySQL之類的存儲是不合適的,如果有這種復(fù)雜業(yè)務(wù)的需求,都建議采用異步寫入。

 

 

 

 

當(dāng)然,也有一些秒殺和搶購采用“滯后反饋”,就是說秒殺當(dāng)下不知道結(jié)果,一段時間后才可以從頁面中看到用戶是否秒殺成功。

但是,這種屬于“偷懶”行為,同時給用戶的體驗也不好,容易被用戶認(rèn)為是“暗箱操作”。推薦:秒殺系統(tǒng)設(shè)計的 5 個要點。

3、高并發(fā)下的數(shù)據(jù)安全

我們知道在多線程寫入同一個文件的時候,會存現(xiàn)“線程安全”的問題(多個線程同時運行同一段代碼,如果每次運行結(jié)果和單線程運行的結(jié)果是一樣的,結(jié)果和預(yù)期相同,就是線程安全的)。

如果是MySQL數(shù)據(jù)庫,可以使用它自帶的鎖機制很好的解決問題,但是,在大規(guī)模并發(fā)的場景中,是不推薦使用MySQL的。秒殺和搶購的場景中,還有另外一個問題,就是“超發(fā)”,如果在這方面控制不慎,會產(chǎn)生發(fā)送過多的情況。

我們也曾經(jīng)聽說過,某些電商搞搶購活動,買家成功拍下后,商家卻不承認(rèn)訂單有效,拒絕發(fā)貨。這里的問題,也許并不一定是商家奸詐,而是系統(tǒng)技術(shù)層面存在超發(fā)風(fēng)險導(dǎo)致的。

超發(fā)的原因

假設(shè)某個搶購場景中,我們一共只有100個商品,在***一刻,我們已經(jīng)消耗了99個商品,僅剩***一個。

這個時候,系統(tǒng)發(fā)來多個并發(fā)請求,這批請求讀取到的商品余量都是99個,然后都通過了這一個余量判斷,最終導(dǎo)致超發(fā)。(同文章前面說的場景)

 

 

 

 

在上面的這個圖中,就導(dǎo)致了并發(fā)用戶B也“搶購成功”,多讓一個人獲得了商品。這種場景,在高并發(fā)的情況下非常容易出現(xiàn)。

悲觀鎖思路

解決線程安全的思路很多,可以從“悲觀鎖”的方向開始討論。

悲觀鎖,也就是在修改數(shù)據(jù)的時候,采用鎖定狀態(tài),排斥外部請求的修改。遇到加鎖的狀態(tài),就必須等待。

 

 

 

 

雖然上述的方案的確解決了線程安全的問題,但是,別忘記,我們的場景是“高并發(fā)”。也就是說,會很多這樣的修改請求,每個請求都需要等待“鎖”,某些線程可能永遠(yuǎn)都沒有機會搶到這個“鎖”,這種請求就會死在那里。

同時,這種請求會很多,瞬間增大系統(tǒng)的平均響應(yīng)時間,結(jié)果是可用連接數(shù)被耗盡,系統(tǒng)陷入異常。推薦:并發(fā)控制--悲觀鎖和樂觀鎖詳解。

FIFO隊列思路

那好,那么我們稍微修改一下上面的場景,我們直接將請求放入隊列中的,采用FIFO(First Input First Output,先進先出),這樣的話,我們就不會導(dǎo)致某些請求永遠(yuǎn)獲取不到鎖??吹竭@里,是不是有點強行將多線程變成單線程的感覺哈。

 

 

 

 

然后,我們現(xiàn)在解決了鎖的問題,全部請求采用“先進先出”的隊列方式來處理。那么新的問題來了,高并發(fā)的場景下,因為請求很多,很可能一瞬間將隊列內(nèi)存“撐爆”,然后系統(tǒng)又陷入到了異常狀態(tài)。

或者設(shè)計一個極大的內(nèi)存隊列,也是一種方案,但是,系統(tǒng)處理完一個隊列內(nèi)請求的速度根本無法和瘋狂涌入隊列中的數(shù)目相比。

也就是說,隊列內(nèi)的請求會越積累越多,最終Web系統(tǒng)平均響應(yīng)時候還是會大幅下降,系統(tǒng)還是陷入異常。

樂觀鎖思路

這個時候,我們就可以討論一下“樂觀鎖”的思路了。樂觀鎖,是相對于“悲觀鎖”采用更為寬松的加鎖機制,大都是采用帶版本號(Version)更新。

實現(xiàn)就是,這個數(shù)據(jù)所有請求都有資格去修改,但會獲得一個該數(shù)據(jù)的版本號,只有版本號符合的才能更新成功,其他的返回?fù)屬徥 M扑]:并發(fā)控制--悲觀鎖和樂觀鎖詳解。

這樣的話,我們就不需要考慮隊列的問題,不過,它會增大CPU的計算開銷。但是,綜合來說,這是一個比較好的解決方案。

 

 

 

 

有很多軟件和服務(wù)都“樂觀鎖”功能的支持,例如Redis中的watch就是其中之一。通過這個實現(xiàn),我們保證了數(shù)據(jù)的安全。 

責(zé)任編輯:龐桂玉 來源: Java技術(shù)棧
相關(guān)推薦

2024-01-11 08:19:14

react打點上報功能Modal組件

2023-02-22 14:50:59

技術(shù)AI

2017-01-12 09:11:07

2017-01-15 10:32:49

大數(shù)據(jù)技術(shù)信息

2010-02-05 17:02:13

Android

2010-05-27 09:54:57

虛擬化

2018-12-03 08:32:47

物聯(lián)網(wǎng)物聯(lián)網(wǎng)設(shè)備IOT

2015-05-11 13:57:15

IT技術(shù)人員思考問題

2009-09-27 11:40:59

服務(wù)器虛擬化

2013-08-01 09:22:08

云計算網(wǎng)絡(luò)SDN

2016-11-09 06:50:43

SDN

2019-08-26 09:15:04

Android數(shù)據(jù)庫安全

2009-07-28 14:30:07

單模光纖接續(xù)

2009-11-25 13:38:20

IIS并發(fā)數(shù)

2021-07-19 22:40:56

Windows 11Windows微軟

2021-09-14 07:32:58

元宇宙VRAR

2010-03-19 10:11:16

二層交換機

2009-10-27 09:26:22

接入網(wǎng)技術(shù)

2009-08-13 17:20:18

DELLLinux筆記本Linux系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號