成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 開發(fā)工具
很多時(shí)候,業(yè)務(wù)有定時(shí)任務(wù)或者定時(shí)超時(shí)的需求,當(dāng)任務(wù)量很大時(shí),可能需要維護(hù)大量的timer,或者進(jìn)行低效的掃描。特別在同時(shí)在線量很大時(shí),很容易CPU100%,如何高效維護(hù)和觸發(fā)大量的定時(shí)/超時(shí)任務(wù),是本文要討論的問題。

一、緣起

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

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

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

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

1. “輪詢掃描法”

1)用一個(gè)Map

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

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

2. “多timer觸發(fā)法”

1)用一個(gè)Map

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

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

  • 方案一:只啟動(dòng)一個(gè)timer,但需要輪詢,效率較低
  • 方案二:不需要輪詢,但每個(gè)請(qǐng)求包要啟動(dòng)一個(gè)timer,比較耗資源

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

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

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

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

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

3)同時(shí)還有一個(gè)Map

環(huán)形隊(duì)列法

同時(shí):

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

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

1. 當(dāng)有某用戶uid有請(qǐng)求包到達(dá)時(shí):

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

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

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

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

2. 哪些元素會(huì)被超時(shí)掉呢?

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

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

3. 優(yōu)勢(shì):

(1)只需要1個(gè)timer

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

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

三、總結(jié)

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

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

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2023-11-07 07:47:35

Topic線程PUSH

2024-11-04 16:01:01

2024-08-06 08:13:26

2024-09-09 08:11:12

2023-11-16 09:30:27

系統(tǒng)任務(wù)

2009-10-28 10:05:29

Ubuntucrontab定時(shí)任務(wù)

2012-02-07 13:31:14

SpringJava

2010-03-10 15:47:58

crontab定時(shí)任務(wù)

2021-04-11 07:48:42

定時(shí)任務(wù)Linux jdk

2020-08-05 07:37:29

任務(wù)系統(tǒng)定時(shí)

2022-03-28 08:31:29

線程池定時(shí)任務(wù)

2024-02-28 09:54:07

線程池配置

2020-12-21 07:31:23

實(shí)現(xiàn)單機(jī)JDK

2010-01-07 13:38:41

Linux定時(shí)任務(wù)

2024-12-27 08:24:55

2023-09-26 11:34:56

Python

2024-05-13 09:49:30

.NETQuartz庫Cron表達(dá)式

2022-04-11 15:56:51

Golang代碼框架

2022-01-04 11:15:02

Spring Boot任務(wù)阻塞

2022-03-17 09:55:05

架構(gòu)分布式選型
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 精品久久香蕉国产线看观看亚洲 | 精品日韩一区 | 日韩免费视频一区二区 | 91视频在线看 | 日韩免费网站 | 亚洲成av片人久久久 | 国产成人精品一区二区三区四区 | 欧美456 | 亚洲高清视频一区 | 国产高清视频在线观看 | 欧美视频一区 | 麻豆国产一区二区三区四区 | 日韩欧美综合 | 久久国产视频播放 | 毛片在线视频 | 欧美一区二区三区在线观看视频 | 亚洲导航深夜福利涩涩屋 | 国产精品自拍视频 | 久久6视频 | 成人免费在线视频 | www.亚洲视频.com | 久草在线| 国产精品久久9 | 欧美一区成人 | 国产精品视频一区二区三区四区国 | 久久精品亚洲精品国产欧美 | 二区在线观看 | 美女网站视频免费黄 | 综合久久久久久久 | 色永久| 亚洲a网| 成人日韩av | 国产一区二区三区久久久久久久久 | 好姑娘高清在线观看电影 | 精品久久久久久 | 国产我和子的乱视频网站 | 欧美色影院 | 日本手机在线 | 亚洲乱码一区二区三区在线观看 | 日韩一区二区在线视频 | 亚洲 欧美 激情 另类 校园 |