生產級別Nodejs開發實踐-使用連接池
引言
做后端開發免不了要和一些 存儲服務器 , 消息服務器 等等 打交道。
起因 (傳統模式, 讀取數據庫)
大家都知道和這些使用 tcp連接 的服務傳遞數據的都必須要打開 一個 連接-connection
例如我們打開一個數據庫并執行一段 sql, 通常都是
connection = open "mysql://127.0.0.1:3306/db" (打開數據庫,并取得持有連接的句柄)
data = connection.exec "select * form table1" (執行 sql 并獲取數據)
connection.close() 顯式的關閉連接
這個方式看上去似乎沒有什么不對的。
但是對于并發量稍大一些的站點來說。一個單元批次的操作就需要打開并關閉一次連接。。。
這 顯然是不能接受的 。
為這樣做不能接受呢?
建立一個tcp連接需要三次握手。而且還需要為對象分配系統資源和內存空間。所以創建一個tcp連接可以說是昂貴的。
回到剛才的話題。這樣平凡的開啟關閉連接不僅對增加客戶端io的壓力,最重要的是大大增加了 tcp 服務器的壓力(mysql, redis)。
那我們再嘗試另外一種方式,那就是不關閉連接,一直使用這個連接呢。答案是: 可以。這種方式 被叫做 長連接 。
那這樣的話,也有一個問題。因為一段時間內一個連接只能做一件事情。那么在并發的情況下這顯然會阻塞整個系統。
那我們能不能嘗試 創建多個連接,并在需要的時候,然后當調用的時候,將沒有被使用的連接拿出來使用,當使用完畢之后,將連接放回去,以供其他調用者使用 的方式的呢?
連接大管家(連接池)
答案是有的:那就是我們要說的 連接池 。當然一個健全的連接池并不僅僅完成以上我所說的功能。
連接預熱 (啟動時自動打開n個連接以供使用)
使用 例如 輪轉法 均勻分發 連接請求
當池中的連接即將耗盡得時候動態產生新的連接
當池中的連接一段時間沒有被調用的時候,自動釋放連接
自動丟棄 已經壞掉的 連接
系統關閉的時自動釋放所有連接
........
以上都屬于連接池的功能。 連接池 可謂是我們 管理連接的管家
Node.js 中的 連接池
說到這里好像還是沒有說到要點。在Node中我們應該怎么呢?
我們可以使用 node-pool 這個模塊 GitHub

更多相關的配置 我就不一一展開討論了。大家可以去 github 上查看項目的 README.md
【生產級別Nodejs開發實踐-強壯的node-server容器PM2】- 敬請期待
注:
存儲服務器 : (數據庫 mysql ..., 緩存 memcached, redis ...)
消息服務器 : (RabbitMQ,ActiveMQ ...)
本文來源:segmentfault-博客 原文鏈接:http://segmentfault.com/blog/yinchangsheng/1190000002432591