软件设计中的心跳机制
原文地址:https://blog.csdn.net/qq1091606981/article/details/76255094
在軟件的設計架構中,心跳檢測很重要,像在dubbo service、web api invoke中,需要consumer端感知provider端是否存活,不存活則切換調用另一個provider。
?
? ? ? ?一、什么是心跳檢測
? ? ? ?判斷對方(設備,進程或其它網元)是否正常動行,一般采用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用于檢測TCP的異常斷開。
? ? ? ?基本原因是服務器端不能有效的判斷客戶端是否在線也就是說,服務器無法區分客戶端是長時間在空閑,還是已經掉線的情況。所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。
? ? ? ?代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到后回復一個固定信息。如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。比如有些通信軟件長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。
? ? ? ? 發包方可以是客戶也可以是服務端,看哪邊實現方便合理。一般是客戶端。服務器也可以定時輪詢發心跳下去。
? ? ? ?一般來說,出于效率的考慮,是由客戶端主動向服務器端發包,而不是相反。
?
? ? ???二、心跳機制的實現機制
網絡中的接收和發送數據都是使用操作系統中的SOCKET進行實現。但是如果此套接字已經斷開,那發送數據和接收數據的時候就一定會有問題。可是如何判斷這個套接字是否還可以使用呢?這個就需要在系統中創建心跳機制。其實TCP中已經為我們實現了一個叫做心跳的機制。如果你設置了心跳,那TCP就會在一定的時間(比如你設置的是3秒鐘)內發送你設置的次數的心跳(比如說2次),并且此信息不會影響你自己定義的協議。所謂“心跳”就是定時發送一個自定義的結構體(心跳包或心跳幀),讓對方知道自己“在線”。 以確保鏈接的有效性。
所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到后回復一個固定信息如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。比如有些通信軟件長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合理。一般是客戶端。服務器也可以定時輪詢發心跳下去。心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活著。事實上這是為了保持長連接,至于這個包的內容,是沒有什么特別規定的,不過一般都是很小的包,或者只包含包頭的一個空包。
在TCP的機制里面,本身是存在有心跳包的機制的,也就是TCP的選項。系統默認是設置的是2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火墻這些斷線。而且邏輯層處理斷線可能也不是那么好處理。一般,如果只是用于保活還是可以的。心跳包一般來說都是在邏輯層發送空的包來實現的。下一個定時器,在一定時間間隔下發送一個空包給客戶端,然后客戶端反饋一個同樣的空包回來,服務器如果在一定時間內收不到客戶端發送過來的反饋包,那就只有認定說掉線了。只需要send或者recv一下,如果結果為零,則為掉線。?
但是,在長連接下,有可能很長一段時間都沒有數據往來。理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節點出現什么故障是難以知道的。更要命的是,有的節點(防火墻)會自動把一定時間之內沒有數據交互的連接給斷掉。在這個時候,就需要我們的心跳包了,用于維持長連接,保活。在獲知了斷線之后,服務器邏輯可能需要做一些事情,比如斷線后的數據清理呀,重新連接呀當然,這個自然是要由邏輯層根據需求去做了。
? ? ? ?總的來說,心跳包主要也就是用于長連接的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。
?
? ? ? ?三、心跳檢測的基本步驟:
? ? ? ?1. 客戶端每隔一個時間間隔發生一個探測包給服務器。
? ? ? ?2. 客戶端發包時啟動一個超時定時器。
? ? ? ?3. 服務器端接收到檢測包,應該回應一個包。
? ? ? ?4. 如果客戶機收到服務器的應答包,則說明服務器正常,刪除超時定時器。
? ? ? ?5. 如果客戶端的超時定時器超時,依然沒有收到應答包,則說明服務器掛了。
總結
以上是生活随笔為你收集整理的软件设计中的心跳机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 主线程启动多个子线程,子线程彼此之间并发
- 下一篇: 支付宝 ACQ.TRADE_NOT_EX