我有一个 Node 应用程序,它访问一个静态的、大型 (>100M)、复杂的内存中数据结构,接受查询,然后通过 HTTP 向客户端提供该数据的一小部分。
大多数查询可以在十分之一秒内得到答复。节点万岁!
但是,对于某些查询,搜索此数据结构需要几秒钟的时间。这很糟糕,因为其他人都必须等待。
为了有效地为更多客户服务,我想使用某种并行性。
但是,因为这个数据结构太大了,我想在worker或者线程或者你有什么之间共享它,所以我不烧几百兆。这将是非常安全的,因为不会写入数据结构。任何其他语言的典型“fork()”都可以做到。
然而,据我所知,在 Node 中进行并行处理的所有标准方法都明确地使这成为不可能。为了安全起见,他们不希望您分享任何内容。
但是有办法吗?
背景:
将这种数据结构放在数据库中,或者使用 memcached 或类似的东西是不切实际的。
WebWorker API 库和类似的库只允许短序列化消息传入和传出工作线程。
Node 的集群使用了一个名为“fork”的调用,但它实际上并不是现有进程的一个 fork,它正在产生一个新进程。所以再一次,没有共享内存。
可能真正正确的答案是使用类似文件系统的访问共享内存,即 tmpfs 或 mmap。有一些节点库使 mount() 和 mmap() 可用于类似的事情。不幸的是,必须在同步查找和读取之上实现复杂的数据结构访问。我的应用程序使用字典数组等。不必重新实现所有这些会很好。