長連線心跳 長連線服務開發的一些實戰經驗分享

2021-10-16 02:30:09 字數 1837 閱讀 4572

linux下我們開發的程式通常扮演者兩種角色,要麼是服務端程式即提供listen 節點給業務發呼叫,另外一種是訪問別的服務獲取一些資料進行進一步處理。

如果你的程式是乙個有網路互動的程式,並且是頻繁的網路互動,為了提高效能,你會盡可能的重複利用已經存在的socket連線,所以就有了我們所謂的連線池,比如mysql連線池,redis連線池。如果每次業務網路請求都需要進行一次socket連線,一次tcp連線需要三次握手,簡單的思考一下ttl就知道這裡的服務效能是多少了,如果是服務端和客戶端在不同的機房比如乙個在北京、乙個在深圳單單是物理距離就要30+ms的延遲。所以我們在開發過程中都會盡可能的重複利用已經建立好的連線。如果乙個號稱是高效能的tcp服務端程式(網路io密集型),如果不是使用長連線那純粹那所謂的高效能估計也噱頭。

這裡要簡單介紹下連線復用、io復用、併發使用鏈路的區別:

1)連線復用就是利用已經存在的socket鏈路,來發起新的網路請求

2) io復用,他是一種網路io、磁碟io的模型,利用這些模型來更方便、更高效地管理多個socket鏈路而已

3) 併發使用鏈路,他是在1)的基礎之上,乙個鏈路可以併發發起多個網路請求(這裡的併發實際上也是序列的,只不過是他不需要等待前乙個請求1的應答回來就可以發起另外乙個新的請求2),比如http/2就是屬於併發使用鏈路,http/1.x 、redis協議都是屬於連線復用的層面。

如果想要重複利用已經建立好的連線那麼就必須要確保鏈路是長期active的。所謂的長連線無非就是保證服務端跟客戶端的socket在linux核心中維護的時間戳在合理的範圍內。如何保持這個時間戳?大家可能都很容易想到可以採用心跳來保持tcp長連線。心跳機制就是通過一些極小的網路資料消耗(但是網路協議棧的頭開銷是免不了的),來告訴對端我還活著,別把我清理掉。

心跳分為業務心跳、tcp探活心跳。

1)業務心跳由業務通過開發**定時給對端傳送乙個類似ping的這種請求。

2)tcp探活心跳(tcp_keepalive_time)

它的作用主要有兩點,一維持連線,二是能把一些異常斷開的鏈路及時**(半開啟的連線)

另外如果你的服務是部署在雲上,則需要了解雲上的虛擬化session超時時長才能合理的設定

比如阿~雲上宿主機和客戶機(虛擬機器)的鏈路如果超過15分鐘沒有任何業務資料,鏈路就會被**,**了還不告訴客戶端和服務端,等到你發資料報的時候你才發現鏈路已經斷掉了(會收到reset包),所以大家需要根據自己的使用場景合理的配置心跳:

/proc/sys/net/ipv4/tcp_keepalive_time

/proc/sys/net/ipv4/tcp_keepalive_probes

/proc/sys/net/ipv4/tcp_keepalive_intvl

關於tcp keepalive_time,僅僅是配置上面幾個是不夠的,需要在程式中呼叫setsockopt,開啟tcpkeepalive,你的服務建立的連線才會享受到linux核心的探活機制。(一般只需要服務端設定,當然客戶端也可以設定但是沒有這個必要)

int keepalive = 1;setsockopt(client_fd, sol_socket, so_keepalive, (void*)&keepalive, sizeof(keepalive));
另外阿~雲上的單個物理機連線數峰值是200萬,所以分配到單個虛擬機器的據我連線大概在100萬左右,如果你的服務是50萬,別人的服務是170萬長連線而且都在同乙個物理機上,那麼此時肯定會出現丟包情況,要麼是你的服務丟包,要麼是別人的服務丟包,所以如果你的服務是部署在阿~雲上需要注意下自己服務長連線的限制(不同的**最大連線數限制可能不同),提前做好溝通。

長連線(輪詢,心跳,socket)

概念 表示客戶端和伺服器端保持聯絡,客戶端向伺服器端一直獲取資料,或者是伺服器端一直向客戶端推送資料。基本的長連線方式 輪詢表示客服端利用定時器原理 setinterval 間隔時間內向伺服器請求最新資料。心跳原理跟輪詢類似,但是心跳在一段時間內沒有向到伺服器請求,就會認為客戶端狀態異常。socke...

mysql 長連線 心跳 使用mysql的長連線

有個資料看得我雲裡霧裡的。現在用自己的言語來總結一下,寫文字,能夠加深自己的理解。也會在寫的過程中幫助自己發現理解方面瑕疵,繼續查資料求證。長連線就可以避免每次請求都建立連線的開銷,節省了時間和io消耗。長連線是提高了效能。不過還有一些細節的問題需要解決,即mysql發現乙個鏈結長時間沒有執行查詢請...

長連線 短連線 心跳的簡單總結

通常瀏覽器訪問伺服器的時候就是短鏈結 連線 資料傳輸 關閉連線 1.client與server通過三次握手建立連線,client傳送請求訊息,server返回響應 2.雙方都可以發起close操作,不過一般都是client先發起close操作 3.短鏈結一般只會在client server之間傳遞一...