【问题标题】:How to Synchronize object between multiple instance of Node Js application如何在 Node Js 应用程序的多个实例之间同步对象
【发布时间】:2017-08-01 20:06:07
【问题描述】:

是否可以锁定 Node JS 应用程序中的任何对象。

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

任何对象或钥匙均可用于识别锁定和解锁功能。

如何在具有多个实例的 NodeJS 应用程序中做到这一点。

【问题讨论】:

标签: node.js concurrency synchronization locking


【解决方案1】:

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

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

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

然而,做你想做的事情的方式不太优雅,虽然不太优雅并不一定更糟。

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

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

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

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

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

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

  1. 锁定和解锁的方式可能有很多种,其中最重要的是使用本机 Node.js 结构。将File System events 与Crypto 组合在一起。但这需要对实际的 Node.js 库和结构有更深层次的理解。

希望这能有所帮助。

【讨论】:

  • 感谢您的详细回答:)
  • 我不认为你可以将节点缓存用作多个节点进程的分布式缓存:该库的创建者也 recommends 使用 memcached 或 redis
【解决方案2】:

我强烈建议您使用Redis。

有几种方法可以创建应用程序/进程共享对象,正如您所提到的,使用锁就是其中之一。

但它们很复杂。除非你真的需要自己做,否则 Redis 就足够了。原子操作跨多个进程、事务等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多