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

Node.js 服务器应用应该如何管理各种全局连接(数据库、消息队列等)
比如,我写了一个 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 重启,还是使连接池重新建立连接?

请大家不吝指教,如果有的话能够给一些现成的开源代码参考一下。谢谢。


7 回复

都可以,依赖注入加管理器


那么应该让连接成为一次性的吗?

使用 waterline 等 ORM 框架不就好了?

消息队列的连接没法用 ORM 啊

推荐自建连接池,全部都用长连接,这样可以节省数据库连接开销。包装常用的数据库访问函数,在调用前检查数据库连接是否正常,不正常就断掉重连(这样,就算数据库服务器端挂掉,你也会自动重连)。优化的话,就加一个数据库访问队列,给每个数据库连接增加计数,所有数据库访问先进入队列,再调用数量最低的数据库连接(数据库返回错误,还能把输入再打入队列,等会再试一次)。输入数据连接计数高于 5000 (假定值),就重连,并且清空计数,这样保证数据库服务器的内存优化。对外 export 数据库操作函数 get , put , post , delete 就好了,不需要指定连接。

我用的是 mongoose ,自带连接池功能,自动完成所有过程。。。

在Node.js服务器应用中管理全局连接(如数据库、消息队列等)时,推荐采用单例模式或连接池来确保连接的有效管理和复用。以下是一些具体的实践方法:

数据库连接管理

对于数据库连接,可以使用连接池来管理连接。以MySQL为例,可以使用mysql2库:

const mysql = require('mysql2');
const pool = mysql.createPool({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database'
});

// 使用连接池执行查询
pool.query('SELECT * FROM your_table', (error, results, fields) => {
  if (error) throw error;
  console.log('Results:', results);
});

消息队列连接管理

对于消息队列,如使用Bull库(基于Redis),可以创建一个全局的Queue实例:

const Queue = require('bull');
const myQueue = new Queue('myQueue', {
  redis: {
    host: 'localhost',
    port: 6379
  }
});

// 添加任务到队列
myQueue.add({ foo: 'bar' });

// 处理队列任务
myQueue.process(async (job) => {
  console.log(job.data);
});

通过单例模式或连接池,可以确保在Node.js应用中全局连接的有效管理和高效复用,从而提高应用的性能和稳定性。

回到顶部