1:心跳機制
1.1心跳包機制
? 跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發(fā)一次捺疼,以此來告訴服務(wù)器总珠,這個客戶端還活著蚤假。事實上這是為了保持長連接,至于這個包的內(nèi)容吊说,是沒有什么特別規(guī)定的论咏,不過一般都是很小的包,或者只包含包頭的一個空包颁井。
? 在TCP的機制里面厅贪,本身是存在有心跳包的機制的,也就是TCP的選項:SO_KEEPALIVE蚤蔓。系統(tǒng)默認(rèn)是設(shè)置的2小時的心跳頻率卦溢。但是它檢查不到機器斷電糊余、網(wǎng)線拔出秀又、防火墻這些斷線。而且邏輯層處理斷線可能也不是那么好處理贬芥。一般吐辙,如果只是用于保活還是可以的蘸劈。
? 心跳包一般來說都是在邏輯層發(fā)送空的echo包來實現(xiàn)的昏苏。下一個定時器,在一定時間間隔下發(fā)送一個空包給客戶端威沫,然后客戶端反饋一個同樣的空包回來贤惯,服務(wù)器如果在一定時間內(nèi)收不到客戶端發(fā)送過來的反饋包,那就只有認(rèn)定說掉線了棒掠。
? 其實孵构,要判定掉線,只需要send或者recv一下烟很,如果結(jié)果為零颈墅,則為掉線。但是雾袱,在長連接下恤筛,有可能很長一段時間都沒有數(shù)據(jù)往來。理論上說芹橡,這個連接是一直保持連接的毒坛,但是實際情況中,如果中間節(jié)點出現(xiàn)什么故障是難以知道的。更要命的是煎殷,有的節(jié)點(防火墻)會自動把一定時間之內(nèi)沒有數(shù)據(jù)交互的連接給斷掉屡谐。在這個時候,就需要我們的心跳包了蝌数,用于維持長連接愕掏,保活顶伞。
? 在獲知了斷線之后饵撑,服務(wù)器邏輯可能需要做一些事情,比如斷線后的數(shù)據(jù)清理呀唆貌,重新連接呀……當(dāng)然滑潘,這個自然是要由邏輯層根據(jù)需求去做了。
? 總的來說锨咙,心跳包主要也就是用于長連接的庇锫保活和斷線處理。一般的應(yīng)用下酪刀,判定時間在30-40秒比較不錯粹舵。如果實在要求高,那就在6-9秒
1.2心跳檢測步驟
1客戶端每隔一個時間間隔發(fā)生一個探測包給服務(wù)器
2客戶端發(fā)包時啟動一個超時定時器
3服務(wù)器端接收到檢測包骂倘,應(yīng)該回應(yīng)一個包
4如果客戶機收到服務(wù)器的應(yīng)答包眼滤,則說明服務(wù)器正常,刪除超時定時器
5如果客戶端的超時定時器超時历涝,依然沒有收到應(yīng)答包诅需,則說明服務(wù)器掛了
1.3 輪詢機制 vs 心跳機制
輪詢:概括來說是服務(wù)端定時主動的去與要監(jiān)控狀態(tài)的客戶端(或者叫其他系統(tǒng))通信,詢問當(dāng)前的某種狀態(tài)荧库,客戶端返回狀態(tài)信息堰塌,客戶端沒有返回或返回錯誤、失效信息分衫、則認(rèn)為客戶端已經(jīng)宕機场刑,然后服務(wù)端自己內(nèi)部把這個客戶端的狀態(tài)保存下來(宕機或者其他),如果客戶端正常丐箩,那么返回正常狀態(tài)摇邦,如果客戶端宕機或者返回的是定義的失效狀態(tài)那么當(dāng)前的客戶端狀態(tài)是能夠及時的監(jiān)控到的,如果客戶端宕機之后重啟了那么當(dāng)服務(wù)端定時來輪詢的時候屎勘,還是可以正常的獲取返回信息施籍,把其狀態(tài)重新更新。
心跳:最終得到的結(jié)果是與輪詢一樣的但是實現(xiàn)的方式有差別概漱,心跳不是服務(wù)端主動去發(fā)信息檢測客戶端狀態(tài)丑慎,而是在服務(wù)端保存下來所有客戶端的狀態(tài)信息,然后等待客戶端定時來訪問服務(wù)端,更新自己的當(dāng)前狀態(tài)竿裂,如果客戶端超過指定的時間沒有來更新狀態(tài)玉吁,則認(rèn)為客戶端已經(jīng)宕機或者其狀態(tài)異常。
心跳機制與輪詢的比較腻异,在我們的應(yīng)用中进副,采用的是心跳,這樣一是避免服務(wù)端的壓力悔常,二是靈活好控制影斑,上一篇文章中提到過,我們的外網(wǎng)服務(wù)端(服務(wù)端)不知道內(nèi)網(wǎng)服務(wù)端(客戶端)的地址机打,有雖然有保存客戶端的socket會話矫户,但是客戶端宕機會話就失效了。所以只能等著他主動來報告狀態(tài)残邀。