node.js socket server 的 close

Posted on Updated on

在 node.js 的文件中,關於 server.close 是這樣寫的:

server.close([callback])

Stops the server from accepting new connections and keeps existing connections. This function is asynchronous, the server is finally closed when all connections are ended and the server emits a ‘close’ event. …

也就是說,socket server 的 close 不是真的關掉這個 server,不是真的把所有正在連線中的 client 全部斷線,它只是停止接收新的連線而已,現有的連線全部都會保持住,而且在這些連線終止時,才會觸發 close 事件或是回呼處理函式。

這邊很有趣,做了幾個小實驗:

Socket Server Close in Nodejs

Socket Server Close in Nodejs 2

我覺得這樣的特性很有趣,能夠用來做一些很友善地處理,例如在收到 server close 事件時,才去關閉資料庫連線,這時候去關閉資料庫連線是很安心的,因為客戶端的連線真的都已經完全關閉了。或是在過於繁忙的時候,暫停接收新的連線,直到系統負荷沒有那麼大的時候,再重新開放、接受新的連線。

不過,不知道大家有沒有發現一個問題:如果在 server 呼叫了 close 之後,client 都不關掉連線,那這樣 server 不就會一直開著嗎?

關於這個問題,官方似乎沒有提供什麼方法,有查到有人是設定一個 timer,幾秒鐘後殺掉整個 process,蠻暴力的做法。

我自己的話,在目前開發的應用中本來就會把所有連線的 socket 都存起來。所以在呼叫 server close 之後,會先傳送一個關閉連線的自定訊息給 client 端,傳送成功後就呼叫 socket end,把這個 client connection 給關閉掉。如此一來,等所有的 connections 都關閉後,就能觸發 server 的 close 事件,進而處理 server 關閉後的後續事宜。

在〈node.js socket server 的 close〉中有 1 則留言

    […] 相關連結:https://imazole.wordpress.com/2014/09/17/socket-server-close-in-nodejs/ […]

發表留言