多線程寫入同一個(gè)文件的時(shí)候,會(huì)存現(xiàn)“線程安全”的問(wèn)題(多個(gè)線程同時(shí)運(yùn)行同一段代碼,如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,結(jié)果和預(yù)期相同,就是線程安全的)。如果是MySQL數(shù)據(jù)庫(kù),可以使用它自帶的鎖機(jī)制很好的解決問(wèn)題,但是在大規(guī)模并發(fā)的場(chǎng)景中,是不推薦使用MySQL的。秒殺和搶購(gòu)的場(chǎng)景中,還有另外一個(gè)問(wèn)題,就是“超發(fā)”,如果在這方面控制不慎,會(huì)產(chǎn)生發(fā)送過(guò)多的情況,比如某些電商搞搶購(gòu)活動(dòng),買家成功拍下后,商家卻不承認(rèn)訂單有效,拒絕發(fā)貨。問(wèn)題也許并不一定是商家奸詐,而是系統(tǒng)技術(shù)層面存在超發(fā)風(fēng)險(xiǎn)導(dǎo)致的。
3、高并發(fā)下的數(shù)據(jù)安全
多線程寫入同一個(gè)文件的時(shí)候,會(huì)存現(xiàn)“線程安全”的問(wèn)題(多個(gè)線程同時(shí)運(yùn)行同一段代碼,如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,結(jié)果和預(yù)期相同,就是線程安全的)。如果是MySQL數(shù)據(jù)庫(kù),可以使用它自帶的鎖機(jī)制很好的解決問(wèn)題,但是在大規(guī)模并發(fā)的場(chǎng)景中,是不推薦使用MySQL的。秒殺和搶購(gòu)的場(chǎng)景中,還有另外一個(gè)問(wèn)題,就是“超發(fā)”,如果在這方面控制不慎,會(huì)產(chǎn)生發(fā)送過(guò)多的情況,比如某些
電商搞搶購(gòu)活動(dòng),買家成功拍下后,商家卻不承認(rèn)訂單有效,拒絕發(fā)貨。問(wèn)題也許并不一定是商家奸詐,而是系統(tǒng)技術(shù)層面存在超發(fā)風(fēng)險(xiǎn)導(dǎo)致的。
3.1、超發(fā)的原因
假設(shè)某個(gè)搶購(gòu)場(chǎng)景中,一共只有100個(gè)商品,在最后一刻,我們已經(jīng)消耗了99個(gè)商品,僅剩最后一個(gè)。這個(gè)時(shí)候,系統(tǒng)發(fā)來(lái)多個(gè)并發(fā)請(qǐng)求,這批請(qǐng)求讀取到的商品余量都是99個(gè),然后都通過(guò)了這一個(gè)余量判斷,最終導(dǎo)致超發(fā)。這就導(dǎo)致了并發(fā)用戶B也“搶購(gòu)成功”,多讓一個(gè)人獲得了商品。這種場(chǎng)景在高并發(fā)的情況下非常容易出現(xiàn)。
3.2、悲觀鎖思路
悲觀鎖也就是在修改數(shù)據(jù)的時(shí)候,采用鎖定狀態(tài),排斥外部請(qǐng)求的修改,遇到加鎖的狀態(tài),就必須等待,雖然上述的方案的確解決了線程安全的問(wèn)題,但是我們的場(chǎng)景是“高并發(fā)”,也就是說(shuō)會(huì)很多這樣的修改請(qǐng)求,每個(gè)請(qǐng)求都需要等待“鎖”,某些線程可能永遠(yuǎn)都沒(méi)有機(jī)會(huì)搶到這個(gè)“鎖”,這種請(qǐng)求就會(huì)死在那里。同時(shí)這種請(qǐng)求會(huì)很多,瞬間增大系統(tǒng)的平均響應(yīng)時(shí)間,結(jié)果是可用連接數(shù)被耗盡,系統(tǒng)陷入異常。
3.3、FIFO隊(duì)列思路
直接將請(qǐng)求放入隊(duì)列中的,采用FIFO(First Input First Output,先進(jìn)先出),這樣的話就不會(huì)導(dǎo)致某些請(qǐng)求永遠(yuǎn)獲取不到鎖??吹竭@里是不是有點(diǎn)強(qiáng)行將多線程變成單線程的感覺(jué)哈,現(xiàn)在解決了鎖的問(wèn)題,全部請(qǐng)求采用“先進(jìn)先出”的隊(duì)列方式來(lái)處理。那么新的問(wèn)題來(lái)了,高并發(fā)的場(chǎng)景下,因?yàn)檎?qǐng)求很多,很可能一瞬間將隊(duì)列內(nèi)存“撐爆”,然后系統(tǒng)又陷入到了異常狀態(tài)?;蛘咴O(shè)計(jì)一個(gè)極大的內(nèi)存隊(duì)列,也是一種方案,系統(tǒng)處理完一個(gè)隊(duì)列內(nèi)請(qǐng)求的速度根本無(wú)法和瘋狂涌入隊(duì)列中的數(shù)目相比。也就是說(shuō)隊(duì)列內(nèi)的請(qǐng)求會(huì)越積累越多,最終Web系統(tǒng)平均響應(yīng)時(shí)候還是會(huì)大幅下降,系統(tǒng)還是陷入異常。
3.4、樂(lè)觀鎖思路
樂(lè)觀鎖是相對(duì)于“悲觀鎖”采用更為寬松的加鎖機(jī)制,大都是采用帶版本號(hào)(Version)更新。這個(gè)數(shù)據(jù)所有請(qǐng)求都有資格去修改,但會(huì)獲得一個(gè)該數(shù)據(jù)的版本號(hào),只有版本號(hào)符合的才能更新成功,其他的返回?fù)屬?gòu)失敗。這樣的話我們就不需要考慮隊(duì)列的問(wèn)題,不過(guò)它會(huì)增大CPU的計(jì)算開銷。但是綜合來(lái)說(shuō),這是一個(gè)比較好的
解決方案。有很多軟件和服務(wù)都“樂(lè)觀鎖”功能的支持,通過(guò)這個(gè)功能可以保證數(shù)據(jù)的安全。
4、隨著
互聯(lián)網(wǎng)的用戶越來(lái)越多,高并發(fā)的場(chǎng)景也變得越來(lái)越多,電商秒殺和搶購(gòu)是兩個(gè)比較典型的高并發(fā)場(chǎng)景,雖然遇到的挑戰(zhàn)多,但是我們不怕,因?yàn)槲覀円恢痹谂Α?/div>
以上就是我們關(guān)于什么是
服務(wù)器高并發(fā)的介紹,希望對(duì)大家有所幫助。