节点 - 在应用程序中正确引用有状态文件

Node - Properly referencing stateful files across an app

在一个包含许多 .js 文件的 Node 项目中,假设我有一个管理昂贵状态的文件:它提供了一个 json blob,它会定期从网络上以短时间间隔获取。它的数据被缓存并且在内部被请求远远超过它的更新间隔。

let provider = require('./config-provider.js');
let config = provider.get(); // returns locally cached JSON blob

假设上述代码存在于我的应用程序的 10 个不同文件中。这将创建此更新程序的 10 个不同实例,所有实例都进行昂贵的 Web 调用来更新配置。

我想在我的应用程序中引用此配置提供程序的单个实例。然而,这似乎打破了Node应用程序的模块化设计。

我总是可以使用全局对象,但这显然是不受欢迎的。

另一个解决方案是在我的应用程序中创建一个包含 parent / child 引用的复杂网络。这也显得凌乱。

对于跨 Node 应用程序跨度引用单个有状态模块,是否有一些建议的最佳实践?

在这种情况下,您应该使用 here. I also find this code example useful. Notice that some developers frown upon singletons in Node JS as discussed here 中描述的 "singleton" 模式。

无论如何,这种模式对您来说是有意义的,正如您所说:

I would like to reference a single instance of this config provider across my app

其他重要考虑因素

除了编码之外,当您将应用程序部署到生产环境时,您还必须考虑是否要复制这个单个实例。例如,如果您部署了 3 个 Node JS 实例,您是否仍需要一个实例来处理所有 JSON blob?或者复制3次也可以吗?

不久前,我部署了一个调度模块,其中包含 5 个 Node JS 实例。显然我不能让调度程序触发同一个作业 5 次,所以它有自己的独立实例并且调度模块本身是一个单例。我提出这个问题是因为单例对象和如何多次部署 Node JS 之间有明显的区别。

希望对您有所帮助。