假設(shè)有以下突發(fā)意外情況:

          * 用戶進(jìn)入信號(hào)不好的地方,手機(jī)沒有網(wǎng)絡(luò)信號(hào)了
          * 上網(wǎng)的路由器突然掉線了
          這個(gè)時(shí)候,比如微信發(fā)消息,消息就會(huì)轉(zhuǎn)圈圈,甚至變成紅色嘆號(hào)……
          上面情況都會(huì)導(dǎo)致“長(zhǎng)連接”不可用。
          我們知道,為了讓消息能更加實(shí)時(shí)、可靠、快速地觸達(dá)到接收方,大部分 IM
          系統(tǒng)會(huì)通過“長(zhǎng)連接”的方式來建立收發(fā)雙方的通信通道,長(zhǎng)連接一旦建立,就一直存在,除非網(wǎng)絡(luò)被中斷。

          有了這基于 TCP 長(zhǎng)連接的通信協(xié)議,在用戶上線連接時(shí),可以在服務(wù)端維護(hù)好連接到服務(wù)器的用戶設(shè)備和具體 TCP
          連接的映射關(guān)系,服務(wù)端也能通過這個(gè)映射關(guān)系隨時(shí)找到對(duì)應(yīng)在線的用戶的客戶端。對(duì)于發(fā)送方來說,發(fā)送消息也能通過“長(zhǎng)連接”通道把消息給到 IM 服務(wù)端。

          一、什么是心跳機(jī)制


          但長(zhǎng)連接并不是永久可用的,當(dāng)長(zhǎng)連接在中間鏈路出問題時(shí),為了不使用戶感知到,應(yīng)快速通知連接的兩端,并重新建立新的可用連接,從而使長(zhǎng)連接一直保持“高可用”狀態(tài),這個(gè)能夠快速、不間斷識(shí)別連接可用性的機(jī)制,稱為“心跳機(jī)制”。


          “心跳機(jī)制”會(huì)持續(xù)地往連接發(fā)送“模擬數(shù)據(jù)”,一方面是為了試探連接的可用性,另一方面也是為了保證數(shù)據(jù)的持續(xù)流通,讓連接在沒有真正業(yè)務(wù)數(shù)據(jù)收發(fā)的情況下,不會(huì)被中間的網(wǎng)絡(luò)運(yùn)營商以為連接沒有被使用而切斷連接。

          二、心跳機(jī)制的優(yōu)點(diǎn)

          1. 降低服務(wù)端開銷

          消息之所以能夠?qū)崿F(xiàn)“服務(wù)端推送”,是因?yàn)獒槍?duì)每一臺(tái)上線的設(shè)備,都會(huì)在 IM 服務(wù)端維護(hù)相應(yīng)的 用戶設(shè)備<->網(wǎng)絡(luò)連接
          這樣的映射關(guān)系,除此之外,為了節(jié)省網(wǎng)絡(luò)開銷,還會(huì)在服務(wù)端臨時(shí)緩存一些不用每次請(qǐng)求都攜帶的客戶端信息,如 app
          版本號(hào)、操作系統(tǒng)、網(wǎng)絡(luò)狀態(tài)等,甚至還會(huì)在服務(wù)端維護(hù)一些“用戶在線狀態(tài)”和“所有在線設(shè)備”這些信息,便于業(yè)務(wù)使用,這樣客戶端一旦建好長(zhǎng)連接,只需要首次攜帶這些信息,后續(xù)請(qǐng)求可以不用再攜帶,而是使用
          IM 服務(wù)端緩存的這些信息。

          若沒有心跳機(jī)制,當(dāng)長(zhǎng)連接異常而 IM 服務(wù)端無法感知到,會(huì)產(chǎn)生兩種不良后果:

          * 無效的長(zhǎng)連接一直在被維護(hù),不管是連接句柄,還是緩存大量“映射關(guān)系”、“設(shè)備狀態(tài)”等信息,都會(huì)導(dǎo)致資源浪費(fèi);
          * 向無效連接推送消息,以及后續(xù)的重試推送,都會(huì)降低服務(wù)的整體性能。
          2. 支持客戶端斷線重連

          當(dāng)客戶端和 IM 服務(wù)端之間的網(wǎng)絡(luò)在中間某些環(huán)節(jié)斷開,或服務(wù)器負(fù)載過高,則會(huì)出現(xiàn)客戶端在一定的超時(shí)時(shí)間內(nèi),發(fā)出的心跳包得不到 IM
          服務(wù)端響應(yīng)的現(xiàn)象,這時(shí)客戶端就可以認(rèn)為和服務(wù)端的長(zhǎng)連接不可用,自動(dòng)斷線重連,保持長(zhǎng)連接的可用性。

          3. 連接?;?br>
          即使用戶網(wǎng)絡(luò)和中間路由網(wǎng)絡(luò)都正常,若一直沒有數(shù)據(jù)收發(fā),運(yùn)營商就會(huì)將這個(gè)長(zhǎng)連接清除掉,來降低自身網(wǎng)關(guān)的壓力,這個(gè)清除動(dòng)作不會(huì)被客戶端和 IM
          服務(wù)端感知到,為了避免被運(yùn)營商干掉,客戶端會(huì)在沒有消息收發(fā)的空閑時(shí)間給服務(wù)端發(fā)送心跳包,使長(zhǎng)連接存活時(shí)間更長(zhǎng)。

          三、心跳檢測(cè)的方式

          1. TCP Keepalive

          Keepalive 并不是 TCP 協(xié)議的一部分,但大多數(shù)操作系統(tǒng)都實(shí)現(xiàn)了這個(gè)機(jī)制,操作系統(tǒng)默認(rèn)是關(guān)閉這個(gè)特性的,需要由應(yīng)用層來開啟。TCP 的
          keepalive 會(huì)在連接空閑期按一定的頻次,自動(dòng)發(fā)送不攜帶數(shù)據(jù)的探測(cè)報(bào)文,來探測(cè)對(duì)方是否存活。

          Keepalive 默認(rèn)是關(guān)閉的,開啟 Keepalive 需要在 TCP 的 socket 中單獨(dú)開啟,操作系統(tǒng)層面有三個(gè)參數(shù)影響到 Keepalive
          的行為:
          tcp_keepalive_time 7200 // 心跳周期:距離上次傳送數(shù)據(jù)多少時(shí)間未收到新報(bào)文判斷為開始檢測(cè),單位秒,默認(rèn)7200s
          tcp_keepalive_intvl 75 // 超時(shí)時(shí)間:檢測(cè)開始每多少時(shí)間發(fā)送心跳包,單位秒,默認(rèn)75s tcp_keepalive_probes 9
          // 失敗后重試次數(shù):發(fā)送幾次心跳包對(duì)方未響應(yīng)則close連接,默認(rèn)9次
          優(yōu)點(diǎn):

          * 易用性好:作為系統(tǒng)層 TCP/IP 協(xié)議層的已有實(shí)現(xiàn),不需要其他開發(fā)工作量,上層應(yīng)用只需要處理探測(cè)后的連接異常情況即可。
          * 網(wǎng)絡(luò)消耗小:心跳包不攜帶數(shù)據(jù),帶寬資源浪費(fèi)少。
          缺點(diǎn):

          * 心跳間隔靈活性差:一臺(tái)服務(wù)器某一時(shí)間只能調(diào)整為固定間隔的心跳。
          * 結(jié)果反映差:可以探測(cè)網(wǎng)絡(luò)連接層的存活,但并不代表真正的應(yīng)用層處于可用狀態(tài),即網(wǎng)絡(luò)仍然是通的,但應(yīng)用已不可用。
          2. 應(yīng)用層心跳

          應(yīng)用層心跳實(shí)際上是客戶端每隔一定時(shí)間間隔,向 IM 服務(wù)端發(fā)送一個(gè)業(yè)務(wù)層的數(shù)據(jù)包告知自身存活。如果 IM
          服務(wù)端在一定時(shí)間內(nèi)沒有收到心跳包,就認(rèn)定客戶端由于某種原因連接不可達(dá)了,此時(shí)就會(huì)從 IM 服務(wù)端把這個(gè)連接斷開,同時(shí)清除相應(yīng)分配的其他資源。
          優(yōu)點(diǎn):

          * 心跳間隔靈活性強(qiáng):應(yīng)用層心跳可以根據(jù)實(shí)際網(wǎng)絡(luò)的情況,來靈活設(shè)置心跳間隔,節(jié)省網(wǎng)絡(luò)流量。
          * 結(jié)果反饋準(zhǔn):由于需要在應(yīng)用層進(jìn)行發(fā)送和接收的處理,不僅能代表網(wǎng)絡(luò)可用,更能反映應(yīng)用的可用性。
          缺點(diǎn):

          * 額外的數(shù)據(jù)傳輸開銷(非常?。?。
          * 實(shí)現(xiàn)邏輯根據(jù)心跳策略而定,有的實(shí)現(xiàn)起來略復(fù)雜。
          3. 智能心跳

          心跳間隔能夠根據(jù)網(wǎng)絡(luò)環(huán)境自動(dòng)調(diào)整,逐步逼近 NAT 超時(shí)臨界點(diǎn),在保證 NAT 不超時(shí)的情況下盡量節(jié)約設(shè)備資源,常見的有二分法。但需要權(quán)衡使用。

          四、小結(jié)

          * 能夠快速、不間斷識(shí)別連接可用性的機(jī)制,稱為“心跳機(jī)制”。
          * 心跳機(jī)制可以降低服務(wù)端連接維護(hù)無效連接的開銷,支持客戶端快速識(shí)別無效連接、自動(dòng)斷線重連,連接?;?,避免被運(yùn)營商 NAT 超時(shí)斷開。
          * 心跳可以使用 TCP Keepalive、應(yīng)用層心跳等方式來檢測(cè),前者可探測(cè)網(wǎng)絡(luò)連接可用性,后者可探測(cè)網(wǎng)絡(luò)和服務(wù)的可用性。

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                性爱激情视频网站 | 爱国操逼中国操逼操逼 | 留守少妇无力反抗呻吟 | 插逼大片 | 成人性生交大片免费看2023年 |