生產級別Nodejs開發實踐-使用連接池

jopen 9年前發布 | 21K 次閱讀 Node.js 開發 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!