NodeJS如何實現真正的長連接?

什麼是長連接?

長連接,即:keepalive啟用。

通俗的講:

非長連接狀態下,每個請求與服務器通信完畢後,通道就關閉了。再次請求時,還需要重新打開通道。

而如果是長連接,請求完成後,通道在一定時間內不會關閉,再次請求時不需要重開通道,這是就有通信效率上的優勢。

NodeJS如何實現真正的長連接?

什麼時候適合啟用長連接?

1、當web上的靜態網頁,如:Html、圖片、Css、Js居多時,建議啟用長連接 。

2、當你的web多為動態請求,比有較多數據庫操作。應該關閉長連接,這會節省內存,降低I/O壓力。

注意:當長連接開啟,KeepAlive =On時,KeepAliveTimeOut的設置其實也是一個問題,設置的過短,會導致頻繁建立連接,給Cpu造成壓力,設置的過長,系統中就會堆積無用的Http連接,消耗掉大量內存。所以,是否啟用長連接,以及長連接超時值是多少,需要根據不同的網站情況而定。

NodeJS編程中的長連接應用場景

在nodejs應用開發中,有多種場景需要控制長連接。

如:web服務器、web客戶端、反向代理等。

本例,實現一個簡單反向代理,代碼如下:

NodeJS如何實現真正的長連接?

運行,看連接狀態:

WEB到代理服務器的connection為close,即短連接。

NodeJS如何實現真正的長連接?

代理服務器到client/瀏覽器,也是close,即短連接。

NodeJS如何實現真正的長連接?

這時,修改代碼,在代理服務器向web的連接中,增加agent參數,設置keepalive為true。

NodeJS如何實現真正的長連接?

再運行:

客戶端到代理的請求、代理到客戶端的連接,都成為keep-alive了,即:長連接。

NodeJS如何實現真正的長連接?

代理到web、web到代理的連接,也都成為長連接:

NodeJS如何實現真正的長連接?

NodeJS如何實現真正的長連接?

即此時,已經實現了完整長連接。

注意,在研究過程中,曾嘗試過多種方式,比如手動設定數據包頭:

setHeader("connection", "keep-alive");

或者從socket中設置keepalive:

req.socket.setKeepAlive

都是無效或實現效果是殘缺的、不是完整的長連接。


分享到:


相關文章: