首先贴下源码 https://github.com/nswbmw/koa-mongo
最近看了下 koa2 准别用下,用到 mongodb 就找了个中间件 koa-mongo,看了下源码,发现有问题。
这个中间件包装了一个数据库连接池,但是 mongodb 官方提供的 nodejs 驱动就已经包含连接池了,按我理解应该是多此一举。
另外,koa 的中间件是洋葱模型,每个请求都会一行一次,koa-mongo 这个中间件会在每个请求到来都获取一个数据库连接(包括用不到数据库的静态资源请求),然后在 http 请求完成后又主动断开数据库连接。请求一多,那就是频繁的在获取数据库连接然后又断开,严重浪费资源,数据库连接应该是有空闲检查的,空间一段时间才自动断开( mongodb 官方提供的驱动就是有这个空间参数设置)
合理的做法应该是直接使用官方提供的 nodejs 驱动,不需要再次包装连接池;只在 app 启动时初始化连接数据库,后面直接用。
如果没理解好洋葱模型,随意加中间件,会导致各种资源浪费。
以上就是我发现的一些问题,也可能是我理解不到位,说得不对的地方,可以评论告诉我。
1
EPr2hh6LADQWqRVH 2021-07-05 11:36:03 +08:00
总体来讲问题不大,连接没有每次都销毁,只是释放而已。
在高压力环境下,自带的那 5 个连接根本不够看,自己搞个连接池简单直接。 一道业务请求里搞不好就会用光这 5 个,所以一个请求配一个 mongoClient 问题不大。 这个连接池库用的也是通用实现,pg 也用这个。 |
2
balabalaguguji OP @avastms #1 自带 5 个?可以自定义的
|
3
EPr2hh6LADQWqRVH 2021-07-05 11:50:58 +08:00
@balabalaguguji 你要都自己指定了那还说啥,你也可以把 mongo 的连接池指定为 1 然后用外部这个连接池啊,这货的主要功能就是个连接池,你不想要就不用它算了喽
|
4
4771314 2021-07-05 17:37:58 +08:00
没太看懂使用 mongodb 为什么要使用中间件?你的 Node 服务是没有接口、每次请求都需要访问 mongodb ?而且下载量和 start 都这么少的库,lz 也敢使用,是个狼人没错了
|
5
balabalaguguji OP @4771314 #4 看了源码后没敢用了,刚接触,所以都看看
|
6
4771314 2021-07-05 19:35:39 +08:00
@balabalaguguji 要使用 mongodb 的话,直接使用官方提供的 mongoose 就可以了
|
7
balabalaguguji OP @4771314 #6 mongoose 并不是官方提供的吧
|