作后端开发免不了要和一些 存储服务器
, 消息服务器
等等 打交道。node
你们都知道和这些使用 tcp链接 的服务传递数据的都必需要打开 一个 链接-connection
mysql
例如咱们打开一个数据库并执行一段 sql, 一般都是git
connection = open "mysql://127.0.0.1:3306/db"
(打开数据库,并取得持有链接的句柄)data = connection.exec "select * from table1"
(执行 sql 并获取数据)connection.close()
显式的关闭链接
这个方式看上去彷佛没有什么不对的。github
可是对于并发量稍大一些的站点来讲。一个单元批次的操做就须要打开并关闭一次链接。。。
这显然是不能接受的。redis
创建一个tcp链接须要三次握手。并且还须要为对象分配系统资源和内存空间。因此建立一个tcp链接能够说是昂贵的。sql
回到刚才的话题。这样平凡的开启关闭链接不只对增长客户端io的压力,最重要的是大大增长了 tcp 服务器的压力(mysql, redis)。数据库
那咱们再尝试另一种方式,那就是不关闭链接,一直使用这个链接呢。答案是: 能够。这种方式 被叫作 长链接
。npm
那这样的话,也有一个问题。由于一段时间内一个链接只能作一件事情。那么在并发的状况下这显然会阻塞整个系统。后端
那咱们能不能尝试建立多个链接,而后当调用的时候,将没有被使用的链接拿出来使用,当使用完毕以后,将链接放回去,以供其余调用者使用的方式的呢?缓存
答案是有的:那就是咱们要说的链接池
。固然一个健全的链接池并不单单完成以上我所说的功能。
- 链接预热 (启动时自动打开n个链接以供使用)
- 使用 例如
轮转法
均匀分发 链接请求- 当池中的链接即将耗尽得时候动态产生新的链接
- 当池中的链接一段时间没有被调用的时候,自动释放链接
- 自动丢弃 已经坏掉的 链接
- 系统关闭的时自动释放全部链接
........
以上都属于链接池的功能。链接池
可谓是咱们管理链接的管家
说到这里好像仍是没有说到要点。在Node中咱们应该怎么呢?
咱们可使用 node-pool
这个模块 GitHub
1. 安装 npm install generic-pool
2. 建立一个链接池 // 建立一个 mysql 链接池 var poolModule = require('generic-pool'); var pool = poolModule.Pool({ name : 'mysql', //将建 一个 链接的 handler create : function(callback) { var Client = require('mysql').Client; var c = new Client(); c.user = 'scott'; c.password = 'tiger'; c.database = 'mydb'; c.connect(); callback(null, c); }, // 释放一个链接的 handler destroy : function(client) { client.end(); }, // 链接池中最大链接数量 max : 10, // 链接池中最少链接数量 min : 2, // 若是一个线程3秒钟内没有被使用过的话。那么就释放 idleTimeoutMillis : 30000, // 若是 设置为 true 的话,就是使用 console.log 打印入职,固然你能够传递一个 function 最为做为日志记录handler log : true });
3. 从链接池中得到连接并使用 // 默认无任务优先级, 可是与高优先级同样,在竞争队列的前列 pool.acquire(function(err, client) { pool.release(client); }); // 高优先级得到连接, 在竞争队列的前列 pool.acquire(function(err, client) { pool.release(client); }, 0); // 中等优先级得到连接 pool.acquire(function(err, client) { pool.release(client); }, 1); // pool.acquire(handler, priority) 方法接受连个参数 // handler: 获取链接的回掉函数 // priority: 获取到连接的竞争优先级 // pool.release(client) 方法会将连接放回到链接池当中,当得到的连接没有release的话。将会致使该连接被一直占用
更多相关的配置 我就不一一展开讨论了。你们能够去 github 上查看项目的 README.md
【生产级别Nodejs开发实践-强壮的node进程容器PM2】- 敬请期待
注:存储服务器
: (数据库 mysql ..., 缓存 memcached, redis ...)消息服务器
: (RabbitMQ,ActiveMQ ...)