node.js - 如何在 Node Js 应用程序的多个实例之间同步对象

标签 node.js concurrency synchronization locking

在Node JS应用程序中是否有锁定任何对象的方法。

是否有多个应用程序实例可用,某些功能不应并发运行。如果实例 A 功能完成,它应该解锁该对象/ key 或一些标识符,应用程序 B 实例应该检查它是否解锁它应该运行一些功能。

任何Object或Key都可以用来识别锁定和解锁功能。

如何在具有多个实例的 NodeJS 应用程序中执行此操作。

最佳答案

如上所述,Redis 可能是您的答案,但是,这实际上取决于您可用的资源。还有一些不那么复杂且当然不那么强大的其他可能性也可以解决问题。

  1. node-cache如果设置正确,也可以解决问题。它远不及 Redis 强大,但从好的方面来说,它不需要与您的环境进行太多设置和交互。

所以有 Redis 和 node-cache用于内存锁。我应该提到有相当多的 NPM 包可以做缓存。取决于您需要什么,以及您的缓存需要多么复杂。

然而,有一些不那么优雅的方法可以做你想做的事情,虽然不那么优雅并不一定更糟。

  1. 您可以使用基于 JSON 文件的系统并为 TTL 锁定文件。 lockfileproper-lockfile将完成任务。您可以在需要时从文件中读取信息,在需要时删除,给它们一个 TTL。基本上是磁盘缓存系统。

内存系统明显更快。文件系统需要与内存系统一样多的代码规划。

  1. 还有另一种方法。这可能是最危险的一个,您必须从安全和需求的角度认真考虑后果。

Node.js 有自己的 process.env .正如大多数人所知,只需编写 process.env.foo 即可将系统全局变量提供给所有人,其中 foo 将被声明为全局系统变量。诸如 .dotenv 之类的包裹允许您通过 .env 文本文件添加到系统变量。因此,如果您放入该文件 sam=mongoDB,那么在您编写 process.env.sam 的代码中,它将被解释为 mongoDB。可以在此处设置大量系统范围的变量。

那么您可能会问,这样做有什么好处?好吧,这些是系统范围的变量,它们可以在运行中更改。因此,如果您需要锁定变量然后更改它们,这是一种简单的方法。请注意这里的陷阱。一旦系统宕机,或者所有进程停止,然后重新启动,您的环境变量将恢复为 .env 文件中的默认值。

此外,除非您运行的系统在 AWS 或 Azure 等上比较安全。让我的 .env 文件向全世界开放会让我感到不安全。也有办法解决这个问题。您可以使用散列来加密所有变量并将散列放在文件中。当您调用它时,请在实际请求使用完整变量之前解密。

  1. 锁定和解锁的方法可能有很多,其中最重要的是使用 native Node.js 结构。合并 File System events连同 Crypto .但这需要对实际的 Node.js 库和结构有更深层次的理解。

希望其中一些有所帮助。

关于node.js - 如何在 Node Js 应用程序的多个实例之间同步对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42735992/

相关文章:

java - Grails - 与第 3 方 API 的异步通信

java - Java并发中的AbstractQueuedSynchronizer

ruby - 如何使用 Ruby 的 Fibers 实现并行任务?

apache-kafka - 同步来自多个数据源的数据

javascript - ES6 模板文字只是将我的表达式输出为字符串?

python-shell将json从nodejs发送到python

core-data - RestKit 和 Core Data - 如何 POST 数据?

rest - CouchDB 中的并行/冗余复制

node.js - NodeJS、MSSQL 批量从 API 获取并保存天气观测结果

node.js - MongoError : Write batch sizes must be between 1 and 100000. 进行了 0 次操作