Node.js 服务器应用应该如何管理各种全局连接(数据库、消息队列等)

2017-02-14 22:57:03 +08:00
 t123yh
比如,我写了一个 Web Server 需要使用 MySQL 服务、 RabbitMQ 服务。其中 MySQL 库( mysqljs )自带了 Connection Pool 功能,能够自动处理连接失败等错误,而 RabbitMQ 库就没有带这个功能,只能用 amqp.createConnection 来创建一次性的连接。

那么我有两个问题要请教大家:

* 如何让应用代码来访问这些连接?

我的代码分为很多层,其中 Web Server 是顶层,提供了 REST API ;需要访问数据库、 MQ 的工具库等在最底层。

有两个可能的方式(请大佬们补充):
1. 创建 Web Server 时将连接对象传递进去,然后层层向下传。这样会让函数多出妨碍视觉的参数。

2. 直接创建一个文件 Connection Manager ,在应用程序启动时建立连接,并把连接 add 到这个 manager 里面。底层代码直接 require 这个 manager ,然后用类似于 `const mysqlconn = manager.get('mysql')` 这种方式来调用。

* 我是否应该手动实现一个连接池?是否有现成的轮子?
在应用程序运行过程中,如果 RabbitMQ 服务器挂掉或因故重启了,那么之前创建好的连接就无效了。这时应该直接让 Web Server 重启,还是使连接池重新建立连接?

请大家不吝指教,如果有的话能够给一些现成的开源代码参考一下。谢谢。
3272 次点击
所在节点    Node.js
6 条回复
kfll
2017-02-15 00:47:04 +08:00
都可以,依赖注入加管理器
t123yh
2017-02-15 12:40:09 +08:00
@kfll 那么应该让连接成为一次性的吗?
anchoretic
2017-02-16 12:54:10 +08:00
使用 waterline 等 ORM 框架不就好了?
t123yh
2017-02-16 13:36:53 +08:00
@anchoretic 消息队列的连接没法用 ORM 啊
yunshansimon
2017-03-06 22:58:08 +08:00
推荐自建连接池,全部都用长连接,这样可以节省数据库连接开销。包装常用的数据库访问函数,在调用前检查数据库连接是否正常,不正常就断掉重连(这样,就算数据库服务器端挂掉,你也会自动重连)。优化的话,就加一个数据库访问队列,给每个数据库连接增加计数,所有数据库访问先进入队列,再调用数量最低的数据库连接(数据库返回错误,还能把输入再打入队列,等会再试一次)。输入数据连接计数高于 5000 (假定值),就重连,并且清空计数,这样保证数据库服务器的内存优化。对外 export 数据库操作函数 get , put , post , delete 就好了,不需要指定连接。
libook
2017-04-07 00:22:05 +08:00
我用的是 mongoose ,自带连接池功能,自动完成所有过程。。。

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

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

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

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

© 2021 V2EX