在不同实例之间共享nodejs中的对象

问题描述 投票:0回答:2

我需要在不同节点进程或集群之间共享一些对象或完整模块,我搜索了很多博客都没有得到满意的答案。

如果这是不可能做到的,那么有什么想法可以解决这个问题吗?

javascript node.js shared-memory
2个回答
5
投票

根据配置,我可以想到三种方法。

  1. 如果服务是节点集群,则使用 leveldb 或 redis 等快速数据库。
  2. 如果服务位于同一台机器上但作为单独的进程运行,则 redis 或 unix 套接字可以正常工作。
  3. 如果服务分布在多台机器上,那么 scuttlebutt 提供了一个很好的解决方案。

redis: 使用像 redis 这样的快速本地数据库在同一台计算机上的进程之间共享对象涉及使用简单的 put(key, data) 和 get(key),但您必须序列化和反序列化,可能使用 JSON。没有正式的并发控制,因此您必须注意任何对象更改都可供所有客户端使用。 一种方法是使用 pub/sub 内置的 redis 在发生更改时触发。 另一种方法是使用乐观锁定。

unix 套接字 对于需要共享来自不同技术的对象的项目,例如在 c++ 应用程序和节点之间,unix 套接字提供了一个非常快速的解决方案。 您仍然需要序列化/反序列化和控制并发性,但它比数据库解决方案更快,并且可以跨不同技术工作。 有一个 node 项目 可以帮助解决一些细节问题。

scuttlebutt 可能是在不同机器上的进程之间共享数据的最佳方式。 来自 scuttlebutt 网站

Scuttlebutt 旨在细分为各种数据模型。 提供了两个实现作为示例 scuttlebutt/modelscuttlebutt/events...

还有一篇很好的白皮书,阐述了使用复制来共享对象数据背后的科学原理。

我希望这能为您提供一些可行的替代方案。


1
投票

我大约四五天前看到了你的回答,并决定做点什么来做到这一点

https://npmjs.com/package/webject
这个包可以在网络上共享对象
对象可以通过

serve
托管或通过
connect

连接到

获取 2 个函数,如

let {serve,connect}=require('webject')

有人服务可以像

let myWebject=serve(myObj) //object myObj gets shared, myObj could even be cyclic
let clientToken=myWebject.addToken(1) //level 1 is view only(edits won't edit your server side object)

有人连接可以像

let myClientObj=await connect('wss://example.com:8009',clientToken) //assuming you shared a client token with someone to connect
//this is an asynchronous promise that if you have a valid location and token, you would connect to an object hosted(by that location)
© www.soinside.com 2019 - 2024. All rights reserved.