軟體設計中的心跳機制

2021-09-12 04:30:43 字數 1447 閱讀 7846

前言

在軟體的設計架構中,心跳檢測很重要,像在dubbo service、web api invoke中,需要consumer端感知provider端是否存活,不存活則切換呼叫另乙個provider。

一、什麼是心跳檢測

發包方可以是客戶也可以是服務端,看哪邊實現方便合理。一般是客戶端。伺服器也可以定時輪詢發心跳下去。

一般來說,出於效率的考慮,是由客戶端主動向伺服器端發包,而不是相反。

二、心跳機制的實現機制

網路中的接收和傳送資料都是使用作業系統中的socket進行實現。但是如果此

套接字已經斷開,那傳送資料和接收資料的時候就一定會有問題。可是如何判斷這個套接字是否還可以使用呢?這個就需要在系統中建立心跳機制。其實tcp中已經為我們實現了乙個叫做心跳的機制。如果你設定了心跳,那tcp就會在一定的時間(比如你設定的是3秒鐘)內傳送你設定的次數的心跳(比如說2次),並且此資訊不會影響你自己定義的協議。所謂「心跳」就是定時傳送乙個自定義的結構體(

心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持

長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的乙個空包。

在tcp的機制裡面,本身是存在有心跳包的機制的,也就是tcp的選項。系統預設是設定的是2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火牆這些斷線。而且邏輯層處理斷線可能也不是那麼好處理。一般,如果只是用於保活還是可以的。心跳包一般來說都是在邏輯層傳送空的包來實現的。下乙個定時器,在一定時間間隔下傳送乙個空包給客戶端,然後客戶端反饋乙個同樣的空包回來,伺服器如果在一定時間內收不到客戶端傳送過來的反饋包,那就只有認定說掉線了。只需要

send或者recv一下,如果結果為零,則為掉線。 

但是,在

長連線下,有可能很長一段時間都沒有資料往來。理論上說,這個連線是一直保持連線的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(

防火牆)會自動把一定時間之內沒有資料互動的連線給斷掉。在這個時候,就需要我們的

心跳包了,用於維持長連線,保活。在獲知了斷線之後,伺服器邏輯可能需要做一些事情,比如斷線後的

資料清理呀,重新連線呀當然,這個自然是要由邏輯層根據需求去做了。

總的來說,心跳包主要也就是用於長連線的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。

三、心跳檢測的基本步驟:

1. 客戶端每隔乙個時間間隔發生乙個探測包給伺服器。

2. 客戶端發包時啟動乙個超時定時器。

3. 伺服器端接收到檢測包,應該回應乙個包。

4. 如果客戶機收到伺服器的應答包,則說明伺服器正常,刪除超時定時器。

5. 如果客戶端的超時定時器超時,依然沒有收到應答包,則說明伺服器掛了。

摘錄 網路通訊中的心跳機制的實現

tcp中已經實現了心跳的機制,如果設定了心跳,那tcp就會在一定的時間 比如設定的是 秒鐘 內傳送設定的次數的心跳 比如說 次 並且此資訊不會影響自定義的協議。定義心跳常量 const ioc in 80000000 ioc vendor 18000000 ioc out 40000000 sio ...

Golang 長連線的時候是怎樣做心跳機制的

客戶端傳送心跳請求 重試機制。重試x次失敗則定義為離線 服務端響應心跳請求 超時機制。超時x秒未收到心跳請求則定義為下線 服務端 全域性變數 var ids make map string chan byte func responseheartbeat id string else brief 心...

軟體設計中的演算法

說到演算法這一塊,有大量的知識等著我們去了解,去學習,去 定義 演算法是對特定問題求解步驟的一種描述,它是指令的有序序列,其中每一條指令表示乙個或多個操作。特性 1 有窮性 finiteness 演算法的有窮性是指演算法必須能在執行有限個步驟之後終止 2 確切性 definiteness 演算法的每...