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

时间:2017-03-11 13:48:42

标签: node.js concurrency synchronization locking

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

    如果你正确设置,
  1. node-cache也可以做到这一点。它并不像Redis那样强大,但从好的方面来说,它不需要与环境一样多的设置和交互。
  2. 因此Redis和node-cache用于内存锁定。我应该提到有相当多的NPM包来做缓存。取决于您的需求,以及您的缓存需要复杂程度。

    然而,没有优雅的方法来做你想要的,虽然不那么优雅不一定更糟。

    1. 您可以使用基于JSON文件的系统并对TTL文件保持锁定。 lockfileproper-lockfile将完成任务。您可以在需要时从文件中读取信息,在需要时删除,给他们一个TTL。基本上是缓存系统到磁盘。
    2. 内存系统显然更快。文件系统在代码中需要与内存系统一样多的规划。

      1. 还有另一种方式。这可能是最危险的一个,你必须考虑安全和需要方面的后果。
      2. 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 eventsCrypto结合使用。但这需要更深入地了解实际的Node.js库和结构。
        2. 希望其中一些有所帮助。

答案 1 :(得分:0)

我强烈建议您使用Redis

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

但他们只是复杂。除非你真的需要自己做,否则Redis会足够好。原子操作跨越多个进程,事务处理等。