什麼是長連接?
長連接,即:keepalive啟用。
通俗的講:
非長連接狀態下,每個請求與服務器通信完畢後,通道就關閉了。再次請求時,還需要重新打開通道。
而如果是長連接,請求完成後,通道在一定時間內不會關閉,再次請求時不需要重開通道,這是就有通信效率上的優勢。
什麼時候適合啟用長連接?
1、當web上的靜態網頁,如:Html、圖片、Css、Js居多時,建議啟用長連接 。
2、當你的web多為動態請求,比有較多數據庫操作。應該關閉長連接,這會節省內存,降低I/O壓力。
注意:當長連接開啟,KeepAlive =On時,KeepAliveTimeOut的設置其實也是一個問題,設置的過短,會導致頻繁建立連接,給Cpu造成壓力,設置的過長,系統中就會堆積無用的Http連接,消耗掉大量內存。所以,是否啟用長連接,以及長連接超時值是多少,需要根據不同的網站情況而定。
NodeJS編程中的長連接應用場景
在nodejs應用開發中,有多種場景需要控制長連接。
如:web服務器、web客戶端、反向代理等。
本例,實現一個簡單反向代理,代碼如下:
運行,看連接狀態:
WEB到代理服務器的connection為close,即短連接。
代理服務器到client/瀏覽器,也是close,即短連接。
這時,修改代碼,在代理服務器向web的連接中,增加agent參數,設置keepalive為true。
再運行:
客戶端到代理的請求、代理到客戶端的連接,都成為keep-alive了,即:長連接。
代理到web、web到代理的連接,也都成為長連接:
即此時,已經實現了完整長連接。
注意,在研究過程中,曾嘗試過多種方式,比如手動設定數據包頭:
setHeader("connection", "keep-alive");
或者從socket中設置keepalive:
req.socket.setKeepAlive
都是無效或實現效果是殘缺的、不是完整的長連接。
閱讀更多 WangLiwen 的文章