欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統(tǒng) 1645 0

1. 緣起:

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

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

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

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

2.
適用場(chǎng)合:

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

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

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

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

3 .設(shè)計(jì)思想與實(shí)現(xiàn)

IHeartBeatChecker 接口定義如下:

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

/// <summary>
/// DetectSpanInSecs隔多長(zhǎng)時(shí)間進(jìn)行一次狀態(tài)檢查。
/// </summary>
int DetectSpanInSecs{ get ; set ;}

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

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

/// <summary>
/// Unregister服務(wù)端主動(dòng)取消對(duì)目標(biāo)客戶端的監(jiān)測(cè)。
/// </summary>
void Unregister( string id);

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

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

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

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

SurviveSpanInSecs 屬性表示在沒(méi)有心跳到來(lái)時(shí),客戶端可以存活的最長(zhǎng)時(shí)間。這個(gè)時(shí)間通常要比客戶端定時(shí)發(fā)送“心跳”消息的時(shí)間間隔大一些。

當(dāng)心跳監(jiān)測(cè)器發(fā)現(xiàn)某個(gè)客戶端在規(guī)定的時(shí)間內(nèi)沒(méi)有心跳消息過(guò)來(lái),那么將會(huì)觸發(fā) SomeOneTimeOuted 事件以通知服務(wù)端目標(biāo)客戶端掉線了。

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

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

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

(3) 為了在初始化的時(shí)候啟動(dòng)監(jiān)測(cè)器,其在 Initialize 方法中調(diào)用了循環(huán)引擎的 Start 方法。

4. 使用時(shí)的注意事項(xiàng)

(1) 如果服務(wù)端已經(jīng)確切知道客戶端已經(jīng)離線(比如,客戶端向服務(wù)端發(fā)送“我要退出了”的消息),那么服務(wù)端可以調(diào)用 IHeartBeatChecker. Unregister 方法來(lái)主動(dòng)清除對(duì)目標(biāo)客戶端的監(jiān)測(cè)。

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

(3) 不一定只有心跳消息到來(lái)時(shí),才調(diào)用 RegisterOrActivate 方法來(lái)激活對(duì)應(yīng)的客戶端。實(shí)際上,我們只要收到來(lái)自客戶端的任何消息時(shí),都可以調(diào)用 RegisterOrActivate 方法來(lái)激活它。

(4) 如何設(shè)置 SurviveSpanInSecs 屬性和 DetectSpanInSecs 屬性的值,取決于我們系統(tǒng)的需求。服務(wù)端要求感受客戶端掉線越及時(shí),那么 DetectSpanInSecs 就要設(shè)得越小,而且客戶端發(fā)送心跳的時(shí)間間隔也要越小, SurviveSpanInSecs 也要相應(yīng)的小。 SurviveSpanInSecs 的設(shè)定取決于客戶端發(fā)送心跳的時(shí)間間隔和可以允許的最大網(wǎng)絡(luò)延時(shí)。可以采用如下公式: SurviveSpanInSecs = 客戶端發(fā)送心跳時(shí)間間隔 + 允許的最大網(wǎng)絡(luò)延時(shí)

5. 擴(kuò)展

心跳監(jiān)測(cè)器 IHeartBeatChecker 暫時(shí)沒(méi)有任何擴(kuò)展。

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

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 五月亭亭激情五月 | 天天操天天干天天 | 国产专区视频 | www.福利视频| 成年人免费网站在线观看 | 97超精品视频在线观看 | 色狠狠狠色噜噜噜综合网 | 狠狠色噜噜狠狠狠狠2018 | 国产精品国产三级国产aⅴ原创 | 日韩一区二区在线视频 | 久热精品视频在线播放 | 91麻豆国产极品在线观看洋子 | 成年网站在线观看 | 午夜一区二区三区 | 日韩欧美视频免费观看 | 久操中文| 国产区视频在线观看 | 激情se| 日韩在线播放视频 | 黄色在线观看国产 | 亚洲视频在线看 | 波多野结衣中文一区 | 欧美一区二区三区播放 | 久www | 日韩一区二区在线观看 | 亚洲一区 中文字幕 | 国产精品www视频免费看 | 国产亚洲精品久久久久久久久动漫 | 欧美成人免费高清网站 | 国产在线观看av | 精品欧美一区二区在线看片 | 欧美日韩精品一区二区三区视频 | 日韩三级免费观看 | 欧美一级一级 | 亚洲精品一区二区 | 亚洲国产aⅴ成人精品无吗 国内成人自拍视频 | 免费观看一级毛片 | 国产精品第一区 | 日本大片在线观看免费视频 | 亚洲欧美日韩精品久久奇米色影视 | 91精品国产免费久久久久久 |