NodeJs进程间共享对象

4
我正在为Nodejs创建一个缓存模块,需要使用子进程来利用多个CPU。

possible setup

我希望能够将数据存储在主进程的索引中,或者更好地存储在子进程中,如下所示:
var index = { key1: 21, key2: 22, key3: 55 }

另一个进程应该能够像这样高效地在该索引中搜索:

if('key2' in index) // do stuff

我认为使用IPC比实现共享对象要慢得多。这是否可能?谢谢。


为什么不直接使用Redis、Memcached或者Node-Cache呢?这些成熟的缓存框架都有良好的支持。 - Mattias Åslund
2
@MattiasÅslund 我可以这样做,但这不是这个模块的目的:D - Kosmas Papadatos
为什么会有负评? - NiCk Newman
@KosmasPapadatos,你找到适合你的解决方案了吗?我正在寻找人们来尝试可写版本的mmap-object... - Allen Luce
@NiCkNewman 因为它是堆栈溢出,哈哈(有毒性)。 - Trevor Blythe
2个回答

4
您或许想尝试使用 mmap-object。它基于内存映射文件协调共享内存,这意味着数据既是持久的又在进程间共享。我编写了这个库来避免使用 redis 或类似方案时出现的性能和管理开销。对于您的应用程序,可读写版本 或许是您需要的。

这似乎是一个很好的解决方案@Allen...你今天仍然会建议使用mmap-object吗? - Luca Fagioli
1
当然,@LucaFagioli,它仍在支持大量(生产)服务。即使六年过去了,我还没有看到一个能够达到同样高水平的软件包。 - Allen Luce
我会试一下,然后告诉你结果如何! - Luca Fagioli
它运行得很好,我只是不明白内存是如何分配的。为什么一个包含1,000,000个字符的utf8缓冲区需要近3MB的空间?我正在处理非常大的文件,因此在这种情况下内存使用很重要。 - Luca Fagioli
嗨@LucaFagioli,您可能希望发布一个具有使用细节的实际问题。有关Node.JS中的缓冲区的问题可能会很复杂。 - Allen Luce
嗨@Allen,我做了这个:mmap-object-and-memory-usage-issue - Luca Fagioli

0
我会在您的情况下使用redis。有多种方式可以配置redis,使其根据保存的条目数量或时间,定期将其内存数据存储在磁盘上(http://redis.io/topics/persistence)。
另一个选择可能是在实例之间发送请求,仅将该内存数据保存在主节点上。
当非主节点实例想要保存或加载数据时,它将请求主节点。
以下是一些伪代码:
var SharedMemory = {
  storeObject: function(args, done) {
    if (IAmMaster()) {
      storeObjectToMemory(args);
      done();
    } else {
      sendRequestToMasterForSave(args, done);
    }
  },
  getObject: function(args, done) {
    if (IAmMaster()) {
      done(getObjectFromMemory(args));
    } else {
      getResponseFromMasterForLoad(args, done);
    }
  }
}

然而,这可能会是一个痛苦的过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接