t123yh
V2EX  ›  Node.js

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

  •  
  •   t123yh · Feb 14, 2017 · 4158 views
    This topic created in 3382 days ago, the information mentioned may be changed or developed.
    比如,我写了一个 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 replies    2017-04-07 00:22:05 +08:00
    kfll
        1
    kfll  
       Feb 15, 2017 via Android
    都可以,依赖注入加管理器
    t123yh
        2
    t123yh  
    OP
       Feb 15, 2017 via Android
    @kfll 那么应该让连接成为一次性的吗?
    anchoretic
        3
    anchoretic  
       Feb 16, 2017
    使用 waterline 等 ORM 框架不就好了?
    t123yh
        4
    t123yh  
    OP
       Feb 16, 2017 via Android
    @anchoretic 消息队列的连接没法用 ORM 啊
    yunshansimon
        5
    yunshansimon  
       Mar 6, 2017
    推荐自建连接池,全部都用长连接,这样可以节省数据库连接开销。包装常用的数据库访问函数,在调用前检查数据库连接是否正常,不正常就断掉重连(这样,就算数据库服务器端挂掉,你也会自动重连)。优化的话,就加一个数据库访问队列,给每个数据库连接增加计数,所有数据库访问先进入队列,再调用数量最低的数据库连接(数据库返回错误,还能把输入再打入队列,等会再试一次)。输入数据连接计数高于 5000 (假定值),就重连,并且清空计数,这样保证数据库服务器的内存优化。对外 export 数据库操作函数 get , put , post , delete 就好了,不需要指定连接。
    libook
        6
    libook  
       Apr 7, 2017
    我用的是 mongoose ,自带连接池功能,自动完成所有过程。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3095 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 13:12 · PVG 21:12 · LAX 06:12 · JFK 09:12
    ♥ Do have faith in what you're doing.