生產級Nodejs開發實踐 使用連線池

2021-06-28 02:27:43 字數 2261 閱讀 7703

做後端開發免不了要和一些儲存伺服器,訊息伺服器等等 打交道。

大家都知道和這些使用 tcp連線 的服務傳遞資料的都必須要開啟 乙個連線-connection

例如我們開啟乙個資料庫並執行一段 sql, 通常都是

connection = open "mysql:"(開啟資料庫,並取得持有連線的控制代碼)

data = connection.exec "select * from table1"(執行 sql 並獲取資料)

connection.close()顯式的關閉連線

這個方式看上去似乎沒有什麼不對的。

但是對於併發量稍大一些的站點來說。乙個單元批次的操作就需要開啟並關閉一次連線。。。

顯然是不能接受的

建立乙個tcp連線需要三次握手。而且還需要為物件分配系統資源和記憶體空間。所以建立乙個tcp連線可以說是昂貴的。

回到剛才的話題。這樣平凡的開啟關閉連線不僅對增加客戶端io的壓力,最重要的是大大增加了 tcp 伺服器的壓力(mysql, redis)。

那我們再嘗試另外一種方式,那就是不關閉連線,一直使用這個連線呢。答案是: 可以。這種方式 被叫做長連線

那這樣的話,也有乙個問題。因為一段時間內乙個連線只能做一件事情。那麼在併發的情況下這顯然會阻塞整個系統。

那我們能不能嘗試建立多個連線,然後當呼叫的時候,將沒有被使用的連線拿出來使用,當使用完畢之後,將連線放回去,以供其他呼叫者使用的方式的呢?

答案是有的:那就是我們要說的連線池。當然乙個健全的連線池並不僅僅完成以上我所說的功能。

以上都屬於連線池的功能。連線池可謂是我們管理連線的管家

說到這裡好像還是沒有說到要點。在node中我們應該怎麼呢?

我們可以使用node-pool這個模組 github

1. 安裝 

npm install generic-pool

2. 建立乙個連線池       

// 建立乙個 mysql 連線池

var poolmodule = require('generic-pool');

var pool = poolmodule.pool(,

// 釋放乙個連線的 handler

destroy : function(client) ,

// 連線池中最大連線數量

max : 10,

// 連線池中最少連線數量

min : 2,

// 如果乙個執行緒3秒鐘內沒有被使用過的話。那麼就釋放

idletimeoutmillis : 30000,

// 如果 設定為 true 的話,就是使用 console.log 列印入職,當然你可以傳遞乙個 function 最為作為日誌記錄handler

log : true

});

3. 從連線池中獲得鏈結並使用

// 預設無任務優先順序, 但是與高優先順序一樣,在競爭佇列的前列

pool.acquire(function(err, client) );

// 高優先順序獲得鏈結, 在競爭佇列的前列

pool.acquire(function(err, client) , 0);

// 中等優先順序獲得鏈結

pool.acquire(function(err, client) , 1);

// pool.acquire(handler, priority) 方法接受連個引數

// handler: 獲取連線的回掉函式

// priority: 獲取到鏈結的競爭優先順序

// pool.release(client) 方法會將鏈結放回到連線池當中,當獲得的鏈結沒有release的話。將會導致該鏈結被一直占用

【生產級別nodejs開發實踐-強壯的node程序容器pm2】- 敬請期待

注:儲存伺服器: (資料庫 mysql ..., 快取 memcached, redis ...)

訊息伺服器: (rabbitmq,activemq ...)

SQL生產使用實踐

1.應用場景 查詢近三年的投產數量,如何得到當前月的總數為前幾個月數的加和?思路 使用自連線,date add 函式,date parse 函式。select a.online year,a.online month,sum b.success as success from select subs...

Svn使用實踐 android開發

a svn 分為主幹和分支。主幹用途 常規的 提交了,主要是新功能的提交。分支 分為發布分支,實驗性分支。發布分支用途 乙個版本到開發後期,新需求已不能提交到發布分支上。只能用於修復bug。而敏捷開發中,新功能的開發和bug 的修復通常是同期進行的。b 提交細則 乙個版本的開發主要有以下過程 一 新...

使用MongoDB開發實踐體會

年前在專案中使用了nosql的代表之一 mongodb,微博上總結了一些心得,在這裡和各位分享一下。開發中用mongodb的爽快之處 mongodb是乙個非常適合php開發的 nosql 資料庫,尤其支援高併發和schema free 自由結構 特性,使得php開發變得更靈活,更高效。大家都來試試吧...