国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

10w定時任務(wù),如何高效觸發(fā)超時

2018-09-06 17:51 更新

一、緣起

很多時候,業(yè)務(wù)有定時任務(wù)或者定時超時的需求,當(dāng)任務(wù)量很大時,可能需要維護(hù)大量的timer,或者進(jìn)行低效的掃描。


例如:58到家APP實時消息通道系統(tǒng),對每個用戶會維護(hù)一個APP到服務(wù)器的TCP連接,用來實時收發(fā)消息,對這個TCP連接,有這樣一個需求:“如果連續(xù)30s沒有請求包(例如登錄,消息,keepalive包),服務(wù)端就要將這個用戶的狀態(tài)置為離線”。

其中,單機(jī)TCP同時在線量約在10w級別,keepalive請求包大概30s一次,吞吐量約在3000qps。

一般來說怎么實現(xiàn)這類需求呢?

“輪詢掃描法”

1)用一個Map<uid, last_packet_time>來記錄每一個uid最近一次請求時間last_packet_time

2)當(dāng)某個用戶uid有請求包來到,實時更新這個Map

3)啟動一個timer,當(dāng)Map中不為空時,輪詢掃描這個Map,看每個uid的last_packet_time是否超過30s,如果超過則進(jìn)行超時處理


“多timer觸發(fā)法”

1)用一個Map<uid, last_packet_time>來記錄每一個uid最近一次請求時間last_packet_time

2)當(dāng)某個用戶uid有請求包來到,實時更新這個Map,并同時對這個uid請求包啟動一個timer,30s之后觸發(fā)

3)每個uid請求包對應(yīng)的timer觸發(fā)后,看Map中,查看這個uid的last_packet_time是否超過30s,如果超過則進(jìn)行超時處理


方案一:只啟動一個timer,但需要輪詢,效率較低

方案二:不需要輪詢,但每個請求包要啟動一個timer,比較耗資源


特別在同時在線量很大時,很容易CPU100%,如何高效維護(hù)和觸發(fā)大量的定時/超時任務(wù),是本文要討論的問題

二、環(huán)形隊列法

廢話不多說,三個重要的數(shù)據(jù)結(jié)構(gòu):

1)30s超時,就創(chuàng)建一個index從0到30的環(huán)形隊列(本質(zhì)是個數(shù)組)

2)環(huán)上每一個slot是一個Set<uid>,任務(wù)集合

3)同時還有一個Map<uid, index>,記錄uid落在環(huán)上的哪個slot里 

current index

同時

1)啟動一個timer,每隔1s,在上述環(huán)形隊列中移動一格,0->1->2->3…->29->30->0…

2)有一個Current Index指針來標(biāo)識剛檢測過的slot


當(dāng)有某用戶uid有請求包到達(dá)時

1)從Map結(jié)構(gòu)中,查找出這個uid存儲在哪一個slot里

2)從這個slot的Set結(jié)構(gòu)中,刪除這個uid

3)將uid重新加入到新的slot中,具體是哪一個slot呢 => Current Index指針?biāo)赶虻纳弦粋€slot,因為這個slot,會被timer在30s之后掃描到

4)更新Map,這個uid對應(yīng)slot的index值


哪些元素會被超時掉呢?

Current Index每秒種移動一個slot,這個slot對應(yīng)的Set<uid>中所有uid都應(yīng)該被集體超時!如果最近30s有請求包來到,一定被放到Current Index的前一個slot了,Current Index所在的slot對應(yīng)Set中所有元素,都是最近30s沒有請求包來到的。 


所以,當(dāng)沒有超時時,Current Index掃到的每一個slot的Set中應(yīng)該都沒有元素。 

優(yōu)勢

(1)只需要1個timer

(2)timer每1s只需要一次觸發(fā),消耗CPU很低

(3)批量超時,Current Index掃到的slot,Set中所有元素都應(yīng)該被超時掉


三、總結(jié)

這個環(huán)形隊列法是一個通用的方法,Set和Map中可以是任何task,本文的uid是一個最簡單的舉例。


HashedWheelTimer也是類似的原理,有興趣的同學(xué)可以百度一下這個數(shù)據(jù)結(jié)構(gòu),Netty中的一個工具類,希望大家有收獲,幫忙轉(zhuǎn)發(fā)一下哈。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號