V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
t123yh
V2EX  ›  Node.js

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

  •  
  •   t123yh · 2017-02-14 22:57:03 +08:00 · 3429 次点击
    这是一个创建于 2837 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,我写了一个 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 重启,还是使连接池重新建立连接?

    请大家不吝指教,如果有的话能够给一些现成的开源代码参考一下。谢谢。
    6 条回复    2017-04-07 00:22:05 +08:00
    kfll
        1
    kfll  
       2017-02-15 00:47:04 +08:00 via Android
    都可以,依赖注入加管理器
    t123yh
        2
    t123yh  
    OP
       2017-02-15 12:40:09 +08:00 via Android
    @kfll 那么应该让连接成为一次性的吗?
    anchoretic
        3
    anchoretic  
       2017-02-16 12:54:10 +08:00
    使用 waterline 等 ORM 框架不就好了?
    t123yh
        4
    t123yh  
    OP
       2017-02-16 13:36:53 +08:00 via Android
    @anchoretic 消息队列的连接没法用 ORM 啊
    yunshansimon
        5
    yunshansimon  
       2017-03-06 22:58:08 +08:00
    推荐自建连接池,全部都用长连接,这样可以节省数据库连接开销。包装常用的数据库访问函数,在调用前检查数据库连接是否正常,不正常就断掉重连(这样,就算数据库服务器端挂掉,你也会自动重连)。优化的话,就加一个数据库访问队列,给每个数据库连接增加计数,所有数据库访问先进入队列,再调用数量最低的数据库连接(数据库返回错误,还能把输入再打入队列,等会再试一次)。输入数据连接计数高于 5000 (假定值),就重连,并且清空计数,这样保证数据库服务器的内存优化。对外 export 数据库操作函数 get , put , post , delete 就好了,不需要指定连接。
    libook
        6
    libook  
       2017-04-07 00:22:05 +08:00
    我用的是 mongoose ,自带连接池功能,自动完成所有过程。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5422 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:32 · PVG 11:32 · LAX 19:32 · JFK 22:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.