亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ESBasic 可復用的.NET類庫(09) -- 心跳監(jiān)測

系統(tǒng) 1577 0

1. 緣起:

假設我們的 C/S 系統(tǒng)中服務端與客戶端之間采用 UDP 進行通信,那么服務端如何知道每個客戶端當前是否仍然在線了?有可能某個客戶端一直沒有退出,但是在很長一段時間內都沒有與服務端作任何通信,那么服務端就應該認為這個客戶端已經離線了嗎?為了能讓服務端掌握每個客戶端是否在線的狀態(tài),我們可以這樣做,只要客戶端一啟動起來,就每隔一段時間間隔(如 10 秒)就向服務端發(fā)一個“我還在線”的消息,以表明自己的狀態(tài)。而服務端如果在一個更大的時間間隔內(如 20 秒)都沒有收到某個客戶端的任何消息,則可以判定這個客戶端已經離線了。

這就是我們常用的“心跳”機制,客戶端每隔一段時間間隔發(fā)的那個消息就稱為“心跳消息”,只要心跳還在,就表示自己還是 Alive 的,否則就是斷線 / 下線了。

心跳監(jiān)測器的形象示意圖如下:

ESBasic 可復用的.NET類庫(09) -- 心跳監(jiān)測器 IHeartBeatChecker

2.
適用場合:

在很多基于非連接的通信系統(tǒng)中,心跳機制是經常使用的方案。其最主要的目的是讓服務端能比較及時的掌握到每個客戶端當前的在線狀態(tài),因為這個信息是相當重要的,而且這個狀態(tài)改變時服務端知道得越及時越好。 ESBasic.Threading.Application.IHeartBeatChecker (心跳檢測器)便是用于對每個客戶端的心跳進行監(jiān)控以掌握每個客戶端的在線狀態(tài)的。它經常使用在類似下面的這些場合:

(1) 服務端無法感知客戶端的離線或意外掉線(如網絡中斷、系統(tǒng)重啟等),而這個信息對于服務端而言卻是非常重要的。

(2) 服務端可以感知客戶端的離線或意外掉線,但是這種感知有延遲,而且延遲可能非常大(比如幾分鐘),其程度已經超過了服務端能接受的范圍。比如,基于 TCP C/S 系統(tǒng),客戶端之間與服務端之間有防火墻等相關設備的存在,客戶端掉線時,服務端與防火墻之間對應的連接仍然存在,所以服務端認為客戶端仍然在線,這種狀況可能要持續(xù)幾秒鐘到幾分鐘不等。

(3) 以上所說的服務端 / 客戶端可以認為是一個廣義的定義,只要是通信的雙方(如 P2P )需要知道對方的在線狀態(tài),那么都可以使用心跳機制來解決。

3 .設計思想與實現(xiàn)

IHeartBeatChecker 接口定義如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public interface IHeartBeatChecker
{
/// <summary>
/// SurviveSpanInSecs在沒有心跳到來時,可以存活的最長時間。SurviveSpanInSecs小于等于0,表示存活時間為無限長,而不需要進行心跳檢查
/// </summary>
int SurviveSpanInSecs{ get ; set ;}

/// <summary>
/// DetectSpanInSecs隔多長時間進行一次狀態(tài)檢查。
/// </summary>
int DetectSpanInSecs{ get ; set ;}

/// <summary>
/// Initialize初始化并啟動心跳監(jiān)測器。
/// </summary>
void Initialize();

/// <summary>
/// RegisterOrActivate注冊一個新的客戶端或激活它(收到心跳消息)。
/// </summary>
void RegisterOrActivate( string id);

/// <summary>
/// Unregister服務端主動取消對目標客戶端的監(jiān)測。
/// </summary>
void Unregister( string id);

/// <summary>
/// Clear清空所有的監(jiān)測。
/// </summary>
void Clear();

/// <summary>
/// SomeOneTimeOuted當在規(guī)定的時間內沒有任何消息過來,那么將會觸發(fā)該事件。
/// 注意:該事件的處理函數(shù)嚴禁拋出任何異常。
/// </summary>
event CbSimpleStr SomeOneTimeOuted;
}

根據上述對心跳監(jiān)測器的介紹,我們知道需要定時檢查每個客戶端的狀態(tài),看在規(guī)定的時間間隔內是否有“心跳”消息過來。我們可以借助循環(huán)引擎( ICycleEngine )來進行定時檢查。從 IHeartBeatChecker 接口定義,你有看到它并沒有從 ICycleEngine 繼承,那表明心跳監(jiān)測器不需要被反復的 Start Stop 。相反的, IHeartBeatChecker 提供了一個 Initialize 方法,用于初始化和啟動監(jiān)測器。監(jiān)測器一旦啟動就會在隨系統(tǒng)的生命周期運行,這和我們的絕大部分需求是完全一致的。

DetectSpanInSecs 屬性表示需要間隔多少秒檢測一次客戶端的狀態(tài),這個屬性的值將被直接傳遞給循環(huán)引擎的同名屬性。

SurviveSpanInSecs 屬性表示在沒有心跳到來時,客戶端可以存活的最長時間。這個時間通常要比客戶端定時發(fā)送“心跳”消息的時間間隔大一些。

當心跳監(jiān)測器發(fā)現(xiàn)某個客戶端在規(guī)定的時間內沒有心跳消息過來,那么將會觸發(fā) SomeOneTimeOuted 事件以通知服務端目標客戶端掉線了。

HeartBeatChecker 實現(xiàn)了 IHeartBeatChecker 接口,其實現(xiàn)要注意以下幾點:

(1) HeartBeatChecker 繼承自 BaseCycleEngine ,它借助于循環(huán)引擎來進行任務狀態(tài)的循環(huán)檢測。

(2) 為了允許在多線程的環(huán)境中回調定時器, HeartBeatChecker 必須對內部集合( dicIDTime )進行加鎖控制。

(3) 為了在初始化的時候啟動監(jiān)測器,其在 Initialize 方法中調用了循環(huán)引擎的 Start 方法。

4. 使用時的注意事項

(1) 如果服務端已經確切知道客戶端已經離線(比如,客戶端向服務端發(fā)送“我要退出了”的消息),那么服務端可以調用 IHeartBeatChecker. Unregister 方法來主動清除對目標客戶端的監(jiān)測。

(2) SomeOneTimeOuted 事件的處理函數(shù)不要拋出任何異常,否則會導致后續(xù)的客戶端掉線事件無法被觸發(fā)。這點從我們的實現(xiàn)源碼就可以看到,一旦一個 SomeOneTimeOuted 拋出異常, foreach 將會被迫中斷。而且,更嚴重的是,會導致循環(huán)引擎的停止運行――監(jiān)測器會停止運行。

(3) 不一定只有心跳消息到來時,才調用 RegisterOrActivate 方法來激活對應的客戶端。實際上,我們只要收到來自客戶端的任何消息時,都可以調用 RegisterOrActivate 方法來激活它。

(4) 如何設置 SurviveSpanInSecs 屬性和 DetectSpanInSecs 屬性的值,取決于我們系統(tǒng)的需求。服務端要求感受客戶端掉線越及時,那么 DetectSpanInSecs 就要設得越小,而且客戶端發(fā)送心跳的時間間隔也要越小, SurviveSpanInSecs 也要相應的小。 SurviveSpanInSecs 的設定取決于客戶端發(fā)送心跳的時間間隔和可以允許的最大網絡延時??梢圆捎萌缦鹿剑? SurviveSpanInSecs = 客戶端發(fā)送心跳時間間隔 + 允許的最大網絡延時

5. 擴展

心跳監(jiān)測器 IHeartBeatChecker 暫時沒有任何擴展。

注:ESBasic源碼可到 http://esbasic.codeplex.com/ 下載。
ESBasic討論:37677395
ESBasic開源前言

ESBasic 可復用的.NET類庫(09) -- 心跳監(jiān)測器 IHeartBeatChecker


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 伊人久久综合网站 | 欧美精品一区二区精品久久 | 亚洲成人性视频 | 欧美成人h | 色视频在线免费观看 | 国产成人精品区在线观看 | 国产精品香蕉在线一区二区 | 日韩精品一区二区在线观看 | 久久成人免费观看全部免费 | 国产成人99精品免费视频麻豆 | 久久久久久全国免费观看 | 亚洲国产成人久久综合区 | 久久国产免费福利永久 | 亚洲国产精品婷婷久久 | 91精选国产 | 亚洲福利视频在线 | 91久久精品国产91性色tv | 欧美日韩高清观看一区二区 | 国产精品手机视频 | 综合激情婷婷 | 国产欧美视频一区二区三区 | 五月色婷婷六月噜噜 | 久热re国产手机在线观看 | 天天操天天干天天操 | 色视频网| 97在线看 | 91精品国产闺蜜国产在线 | 亚洲精品视频在线观看免费 | 99这里只有精品66视频 | 中文字幕欧美一区 | 精品无人乱码一区二区三区 | 国产精品k | 久久精品国产半推半就 | 亚洲精品久久久中文字 | 国产成人精品永久免费视频 | 伊人亚洲综合网 | 亚洲sss综合天堂久久久 | 在线视频自拍 | 欧美一级片 在线播放 | 依人九九 | 日本在线一区二区三区 |