生产级Nodejs开发实践-使用连接池
来源:互联网 发布:淘宝店铺粉丝怎么刷 编辑:程序博客网 时间:2024/05/29 17:14
引言
做后端开发免不了要和一些 存储服务器
, 消息服务器
等等 打交道。
起因 (传统模式, 读取数据库)
大家都知道和这些使用 tcp连接 的服务传递数据的都必须要打开 一个 连接-connection
例如我们打开一个数据库并执行一段 sql, 通常都是
connection = open "mysql://127.0.0.1:3306/db"
(打开数据库,并取得持有连接的句柄)data = connection.exec "select * from table1"
(执行 sql 并获取数据)connection.close()
显式的关闭连接
这个方式看上去似乎没有什么不对的。
但是对于并发量稍大一些的站点来说。一个单元批次的操作就需要打开并关闭一次连接。。。
这显然是不能接受的。
为这样做不能接受呢?
建立一个tcp连接需要三次握手。而且还需要为对象分配系统资源和内存空间。所以创建一个tcp连接可以说是昂贵的。
回到刚才的话题。这样平凡的开启关闭连接不仅对增加客户端io的压力,最重要的是大大增加了 tcp 服务器的压力(mysql, redis)。
那我们再尝试另外一种方式,那就是不关闭连接,一直使用这个连接呢。答案是: 可以。这种方式 被叫做 长连接
。
那这样的话,也有一个问题。因为一段时间内一个连接只能做一件事情。那么在并发的情况下这显然会阻塞整个系统。
那我们能不能尝试创建多个连接,然后当调用的时候,将没有被使用的连接拿出来使用,当使用完毕之后,将连接放回去,以供其他调用者使用的方式的呢?
连接大管家(连接池)
答案是有的:那就是我们要说的连接池
。当然一个健全的连接池并不仅仅完成以上我所说的功能。
- 连接预热 (启动时自动打开n个连接以供使用)
- 使用 例如
轮转法
均匀分发 连接请求- 当池中的连接即将耗尽得时候动态产生新的连接
- 当池中的连接一段时间没有被调用的时候,自动释放连接
- 自动丢弃 已经坏掉的 连接
- 系统关闭的时自动释放所有连接
........
以上都属于连接池的功能。连接池
可谓是我们管理连接的管家
Node.js 中的 连接池
说到这里好像还是没有说到要点。在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 ...)
- 生产级Nodejs开发实践-使用连接池
- nodejs使用redis连接池
- Redux 生产实践使用注意事项
- nodejs连接mysql之使用连接池pool
- Centos7安装NodeJS开发环境与生产环境
- 使用nodejs+express开发
- 使用VSCode开发Nodejs
- 如何连接开发环境和生产环境?
- 使用nodejs实现tcp连接
- nodejs连接mysql及使用
- nodejs mysql 连接池
- nodejs+java混合网站开发实践
- 使用nodejs、mongodb、express、linux搭建社区网站(4)-mongodb连接及注册的开发
- 使用nodejs开发命令行工具
- 使用 NodeJS+Express 开发服务端
- 使用Nodejs进行web开发
- nodejs之mysql连接池
- nodejs之memcached连接池
- 决斗场
- CPython 交互操作
- inline-block元素间的换行符空格间隙问题
- MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项
- ListView数据错乱--分析及解决
- 生产级Nodejs开发实践-使用连接池
- PLSQL查询数据中文乱码,显示问号
- Qt-你可以使用加农炮了
- Joda
- 使用Spring MVC统一异常处理实战
- [Azure] 使用azure cli 2.0 利用Key Vault创建自签名证书导入nginx
- Neural Networks神经网络个人小结与MATLAB实现
- 接口与实现:实验1
- 11月23日云栖精选夜读:阿里AI Labs王刚解读9小时卖出百万台的“天猫精灵”