【问题标题】:How to properly use database when scaling a NodeJS app?扩展 NodeJS 应用程序时如何正确使用数据库?
【发布时间】:2019-03-25 06:15:24
【问题描述】:

我想知道在使用cluster 模块扩展我的Node.JS 应用程序时如何正确使用MySQL。目前,我只提出了两个解决方案:

解决方案 1

在每个“worker”上创建一个数据库连接。

解决方案 2

在主进程上建立数据库连接,每当其中一个工作人员请求一些数据时,主进程都会返回数据。但是,使用此解决方案,我不知道如何让工作人员从主进程中检索数据。

我(认为)我做了一个“hacky”解决方法,发出一个唯一编号,然后等待主进程将消息发送回工作人员,事件名称是唯一编号。

如果你不明白我的意思,这里有一些代码:

// Worker process

return new Promise (function (resolve, reject) {
    process.send({
        // Other data here
        identifier: <unique number>
    })

    // having a custom event emitter on the worker

    worker.once(<unique number>, function (data) {
        // data being the data for the request with the unique number

        // resolving the promise with returned data
        resolve(data)
    })
})

//////////////////////////

// Master process

// Custom event emitter on the master process

master.on(<eventName>, function (data) {
    // logic

    // Sending data back to worker
    master.send(<other args>, data.identifier)
}

解决这个问题的最佳方法是什么?

感谢您的阅读。

【问题讨论】:

  • 你为什么不喜欢解决方案 1?
  • 我在 Discord 上问过某人,他说:“在主线程上肯定有 db 访问权限,这将控制数据流,否则你会有有趣的数据竞争和其他未定义的行为”

标签: node.js node-cluster


【解决方案1】:

如果您没有计划使用适当的微服务架构,其中每个进程实际上都有自己的数据库(或者可能只是内存中的存储),那么最好的办法是 IMO 使用由主进程创建的连接池并让每个孩子从该池中请求一个连接。这可能是避免线程安全错误附近问题的最安全方法。

【讨论】:

    【解决方案2】:

    当你在 NodeJS 中集群时,你应该假设每个进程是完全独立的。您真的不应该将这样的消息中继到/从主进程。如果您需要多个线程来访问相同的数据,我认为 NodeJS 不是您应该使用的。但是,如果您只是对数据库进行基本的 CRUD 操作,那么集群(解决方案 1)肯定是要走的路。

    例如,如果您尝试将写入操作扩展到您的数据库(假设您的数据库已正确扩展),则每个写入操作都独立于另一个。当您进行集群时,单个写入请求将负载平衡到您的一个工作人员。然后在工作人员中,您将写入操作异步委托给您的数据库。在这种情况下,不需要主进程。

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 2015-05-23
      • 2018-06-07
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多