亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在互聯網領域,客戶端和服務端之間通常需要建立和保持TCP長連接。所謂長連接,就是通信雙方在建立TCP連接后進行數據通信,一次或若干次通信交互完成之后,不主動斷開連接,而是保持TCP連接不釋放,在隨時需要通信的時候,不再需要重新建立連接。長連接可以提高通信速度、確保實時性、避免短時間內重復連接所造成的網絡資源浪費,例如:即時通信,物聯網等應用場景。對于服務器來說,接入和保持海量的客戶端長連接,需要付出大量的服務器資源(網絡、內存、CPU、文件句柄等)。由于很多客觀原因(例如網絡環境、客戶端本身出現故障等),雙方會建立一些無效的連接,既沒有有效的數據通信,又不會主動關閉,稱之為“死”連接。為了提高服務器資源的利用率,需要將“死”連接主動關閉釋放資源,這就是心跳保活機制。所謂心跳保活,就是在通信過程中,通信雙方定期給對方發送心跳包(一種特殊的數據報文),表示發送方還存活著。服務器收到客戶端定期發送的心跳包之后,就認為客戶端還活著,反之,如果超過規定時間內沒有收到心跳包,則認為客戶端已“死”,需要將TCP連接關閉。因此,服務端需要管理所有客戶端連接會話,記錄所有會話的超時時間,定期把超時的會話連接進行清除。

如何定期把超時的會話清除,如何將有數據通信的活躍連接的會話進行保持?

一種簡單和常用的實現方法是在每次客戶端連接建立的時候,就設置一個定時器和該TCP連接關聯,該定時器在指定超時時間到達之后會關閉該關聯的TCP連接。如果在該定時器超時時間到達之前,關聯的TCP連接鏈路有數據通信,則重置定時器的超時時間。這種方法可以非常精確設置每一個TCP連接保活的超時時間。但是當客戶端接入數量達到海量的時候,該方法會產生大量的定時器任務,對于每一次客戶端連接,都要產生一個對應的定時任務,定時任務的數量等于客戶端連接數,定時任務的維護將耗費比較多的計算資源。

那么,在海量的場景,我們真的需要非常精確的超時保活嗎?當然實際場景對于超時,我們不需要那么精確。因此,有一種更加高效的處理會話保活的算法,叫做時間分桶算法,這種算法可以極大減少了定時任務的數量,只使用一個定時線程就可以處理,極大降低海量連接情況下的計算資源的占用。

時間分桶算法,采用批量處理和近似超時的思想,提升對于客戶端超時判斷的執行效率。服務器有兩類線程,第一類線程是IO處理線程,處理客戶端連接后的IO事件,例如連接建立、報文讀取、連接關閉等事件;第二類線程是會話清理線程,定期清除超時時間桶中的批量超時會話。具體兩種線程的執行過程如下:

第一類IO線程的處理邏輯:

1. 首先,將連續的時間按照固定間隔DT切割成片段,每一個片段就是一個時間桶。建立從任意時刻t到時間桶的映射關系B(t),如圖1所示,B(t1)->B0, B(t2)->B1。

服務器海量TCP連接如何高效保活?

圖1

2. 連接初始化:當客戶端C新建連接的時候,計算出超時的時刻t’=t+DT(假設連接超時時間為DT),計算出B(t’)=B1,因此將連接C1的會話句柄保存在編號為B1的時間桶中,如下圖所示:

服務器海量TCP連接如何高效保活?

圖2

3. 連接保活:當收到客戶端C的數據報文的時候,刷新客戶端新的超時時刻t’<-now+DT,如果得到的時間桶比C原來所在的時間桶更新,即:B(t’)>B(t),則將會話C轉移到B(t’)的時間桶中去。如下圖所示:

服務器海量TCP連接如何高效保活?

圖3

4. 連接刪除:服務端探測到客戶端C的連接發生關閉事件之后,直接從C所在時間桶B(t)中刪除該會話。

 

第二類清理線程的處理邏輯:

1. 初始化:t為當前系統毫秒時間,to為離當前時間最近一個時間桶的超時時刻(時間桶的上界即為時間桶的整體超時時刻)to=UP(B(t))。

2. 更新系統當前時刻t<-now()。

3. 如果t<to(t所在的時間桶還未到超時時刻),則線程睡眠(to-t)毫秒,并且跳轉到步驟2;

4. 否則(t所在時間桶已經到超時時刻),將B(t)中的所有會話批量刪除和關閉連接。超時的時間桶中沒有被轉移走的會話全是超時的。

5. 更新離當前時間最近一個時間桶的的超時時刻to<-to+DT,并跳轉到步驟2。

如下圖所示,隨著時間流逝,當前時刻達到B2的上界UP(B2)時,由于客戶端C1、C7、C8沒有及時轉移,則清理線程會將C1、C7、C8全部清除掉。

服務器海量TCP連接如何高效保活?

圖4

在JAVA開源領域,著名的zookeeper就是使用該算法進行海量連接心跳保活,大家感興趣可以去閱讀一下zookeeper源碼。

分享到:
標簽:服務器
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定