在凱倫的技術交流羣裏,有人拋出這樣一個問題:html
小菜蟲不知道什麼是心跳,趕忙去查了一下百科:緩存
心跳機制是定時發送一個自定義的結構體(心跳包),讓對方知道本身還活着,以確保鏈接的有效性的機制。服務器
所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到後回覆一個固定信息若是服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。好比有些通訊軟件長時間不使用,要想知道它的狀態是在線仍是離線就須要心跳包,定時發包收包。發包方:能夠是客戶也能夠是服務端,看哪邊實現方便合理。通常是客戶端。服務器也能夠定時輪詢發心跳下去。心跳包之因此叫心跳包是由於:它像心跳同樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活着。事實上這是爲了保持長鏈接,至於這個包的內容,是沒有什麼特別規定的,不過通常都是很小的包,或者只包含包頭的一個空包。函數
由於工做關係,常常用到心跳包。以前是在服務端中的鏈接的實體中保持一個timer,每秒加一,每次服務端接到客戶端的心跳,就會把計數置爲0。 當累加到20秒的時候,服務端會接到客戶端拋出的掉線函數回調,就會視爲客戶端掉線,而後從緩存中刪掉掉線用戶。htm
實際測試結果代表,這種判斷掉線的方式很是靠譜。7*24小時運行不會出現任何異常。可是每一個實體保持一個timer,服務器的開銷太大了。blog
因此這裏我想到一種方式,就是在實體中包含一個 DateTime LastReceiveHeartBeatTime字段,每當客戶端來了心跳,服務端就會將這個字段更新一次。get
而後服務端只須要開一個timer,每隔20秒鐘巡查一次實體中的這個字段和當前時間的差值,便可來判斷設備是否掉線。it
這樣就大大的減少了服務端的負擔。ast