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

10w定時任務,如何高效觸發超時

開發 開發工具
很多時候,業務有定時任務或者定時超時的需求,當任務量很大時,可能需要維護大量的timer,或者進行低效的掃描。特別在同時在線量很大時,很容易CPU100%,如何高效維護和觸發大量的定時/超時任務,是本文要討論的問題。

一、緣起

很多時候,業務有定時任務或者定時超時的需求,當任務量很大時,可能需要維護大量的timer,或者進行低效的掃描。

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

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

一般來說怎么實現這類需求呢?

1. “輪詢掃描法”

1)用一個Map

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

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

2. “多timer觸發法”

1)用一個Map

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

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

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

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

二、環形隊列法

廢話不多說,三個重要的數據結構:

1)30s超時,就創建一個index從0到30的環形隊列(本質是個數組)

2)環上每一個slot是一個Set,任務集合

3)同時還有一個Map

環形隊列法

同時:

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

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

1. 當有某用戶uid有請求包到達時:

1)從Map結構中,查找出這個uid存儲在哪一個slot里

2)從這個slot的Set結構中,刪除這個uid

3)將uid重新加入到新的slot中,具體是哪一個slot呢 =>Current Index指針所指向的上一個slot,因為這個slot,會被timer在30s之后掃描到

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

2. 哪些元素會被超時掉呢?

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

所以,當沒有超時時,Current Index掃到的每一個slot的Set中應該都沒有元素。

3. 優勢:

(1)只需要1個timer

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

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

三、總結

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

HashedWheelTimer也是類似的原理,有興趣的同學可以百度一下這個數據結構,Netty中的一個工具類,希望大家有收獲。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

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

系統任務

2009-10-28 10:05:29

Ubuntucrontab定時任務

2012-02-07 13:31:14

SpringJava

2010-03-10 15:47:58

crontab定時任務

2021-04-11 07:48:42

定時任務Linux jdk

2020-08-05 07:37:29

任務系統定時

2022-03-28 08:31:29

線程池定時任務

2024-02-28 09:54:07

線程池配置

2020-12-21 07:31:23

實現單機JDK

2010-01-07 13:38:41

Linux定時任務

2024-12-27 08:24:55

2023-09-26 11:34:56

Python

2024-05-13 09:49:30

.NETQuartz庫Cron表達式

2021-01-13 14:42:36

GitHub代碼Java

2022-04-11 15:56:51

Golang代碼框架

2022-01-04 11:15:02

Spring Boot任務阻塞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品亚洲二区 | 正在播放国产精品 | 色婷婷久久综合 | 国产精品亚洲综合 | 日韩在线免费视频 | 韩国精品在线观看 | 亚洲精品欧美一区二区三区 | 日韩中文字幕视频在线 | 精品www| www.日韩av.com| 盗摄精品av一区二区三区 | 一级毛片视频在线 | 国产精品久久久久999 | 亚洲一区二区中文字幕 | 国产超碰人人爽人人做人人爱 | 国产女人第一次做爰毛片 | 日韩精品一区二区三区老鸭窝 | 久久国产高清 | 日韩电影免费在线观看中文字幕 | 米奇成人网 | 中文字幕一区二区三区乱码在线 | 日日干天天操 | 一区二区影院 | 国产91网站在线观看 | 欧美vide| 欧美日韩久久 | 国产黄色大片在线观看 | 亚洲激情自拍偷拍 | 日韩爱爱网站 | 欧美日韩一区不卡 | 久久久精彩视频 | 日韩一区二区三区在线观看 | 伊人导航| 精品国产乱码久久久久久蜜臀 | 婷婷桃色网 | cao在线 | 精品久久视频 | 欧美精品一二三区 | 国产亚洲第一页 | hitomi一区二区三区精品 | 国产在线精品一区二区三区 |