Timing wheel心跳機制

2022-07-16 03:45:11 字數 922 閱讀 3539

在web服務中,斷開空閒連線是一種減少資源浪費的一種手段,由此就有了心跳機制來判斷乙個連線是否空閒。

一種簡單粗暴的方式:

1. 服務端每個連線儲存乙個最後一次操作的時間戳,每次這個連線對應fd可讀時(客戶端發來請求),就更新一下時間戳。

2. 服務端會起乙個定時任務: close掉在時間戳(now – heart_beat)時刻之前的fd。

這種方式需要不斷的遍歷已有連線,檢查是否過期。

本文介紹的是,george varghese 和 tony lauck 1996 年的**《hashed and hierarchical timing wheels: data structures to efficiently implement a timer facility》中提出了一種時間輪(timing wheel)管理time out事件的方式。

timing wheel原理:

下圖是乙個時間輪模型,假設當前心跳間隔是4s,將時間輪分為4分,每個格仔表示當前格仔的剩餘壽命(s)。

每隔1s,pointer滾動一次,先清理掉0號格仔存放的所有連線,然後當前時刻進來的連線放入(heart_beat – 1)號格仔格仔。

例子:當前時刻conn 1連入,此時conn1剩餘壽命3s,放入3號格仔

1s後,此時conn1剩餘壽命2s

當conn1剩餘壽命為0s時,此連線會被清理。如果恰好這一秒conn進行操作了,那麼會放入3號格仔另乙個conn1,如果時間輪上所有的conn1都被清理,那麼這個連線會被關閉。

實現:事例**可見: 中workthread的實現。

tcp心跳機制

對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。記得以...

Eureka 心跳機制

server服務端 server port 8761 eureka client 例項是否在eureka伺服器上註冊自己的資訊以提供其他服務發現,預設為true register with eureka false 此客戶端是否獲取eureka伺服器登錄檔上的註冊資訊,預設為true fetch r...

tcp心跳機制

對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。記得以...