吐槽下 koa-mongo 这个中间件, koa 不用好,性能会很低

2021-07-05 11:27:00 +08:00
 balabalaguguji

首先贴下源码 https://github.com/nswbmw/koa-mongo

最近看了下 koa2 准别用下,用到 mongodb 就找了个中间件 koa-mongo,看了下源码,发现有问题。

这个中间件包装了一个数据库连接池,但是 mongodb 官方提供的 nodejs 驱动就已经包含连接池了,按我理解应该是多此一举。

另外,koa 的中间件是洋葱模型,每个请求都会一行一次,koa-mongo 这个中间件会在每个请求到来都获取一个数据库连接(包括用不到数据库的静态资源请求),然后在 http 请求完成后又主动断开数据库连接。请求一多,那就是频繁的在获取数据库连接然后又断开,严重浪费资源,数据库连接应该是有空闲检查的,空间一段时间才自动断开( mongodb 官方提供的驱动就是有这个空间参数设置)

合理的做法应该是直接使用官方提供的 nodejs 驱动,不需要再次包装连接池;只在 app 启动时初始化连接数据库,后面直接用。

如果没理解好洋葱模型,随意加中间件,会导致各种资源浪费。

以上就是我发现的一些问题,也可能是我理解不到位,说得不对的地方,可以评论告诉我。

1371 次点击
所在节点    程序员
7 条回复
EPr2hh6LADQWqRVH
2021-07-05 11:36:03 +08:00
总体来讲问题不大,连接没有每次都销毁,只是释放而已。

在高压力环境下,自带的那 5 个连接根本不够看,自己搞个连接池简单直接。

一道业务请求里搞不好就会用光这 5 个,所以一个请求配一个 mongoClient 问题不大。

这个连接池库用的也是通用实现,pg 也用这个。
balabalaguguji
2021-07-05 11:48:10 +08:00
@avastms #1 自带 5 个?可以自定义的
EPr2hh6LADQWqRVH
2021-07-05 11:50:58 +08:00
@balabalaguguji 你要都自己指定了那还说啥,你也可以把 mongo 的连接池指定为 1 然后用外部这个连接池啊,这货的主要功能就是个连接池,你不想要就不用它算了喽
4771314
2021-07-05 17:37:58 +08:00
没太看懂使用 mongodb 为什么要使用中间件?你的 Node 服务是没有接口、每次请求都需要访问 mongodb ?而且下载量和 start 都这么少的库,lz 也敢使用,是个狼人没错了
balabalaguguji
2021-07-05 17:39:53 +08:00
@4771314 #4 看了源码后没敢用了,刚接触,所以都看看
4771314
2021-07-05 19:35:39 +08:00
@balabalaguguji 要使用 mongodb 的话,直接使用官方提供的 mongoose 就可以了
balabalaguguji
2021-07-05 19:40:22 +08:00
@4771314 #6 mongoose 并不是官方提供的吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/787575

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX