javascript - 在不同的 Node.js 实例之间共享对象
我需要在不同的节点进程或集群之间共享一些对象或完整模块,我查阅了很多博客但没有得到满意的答案。
如果那不可能做到,那么有什么办法能够处理吗?
答案#1
根据配置,我能想到三种方式。
- 如果服务是节点集群,那么可以使用像 LevelDB 或 Redis 这样的快速数据库。
- 如果服务在同一台机器上但作为独立进程运行,那么 Redis 或 Unix 套接字效果很好。
- 如果服务分布在多台机器上,那么 Scuttlebutt 提供了一个很好的解决方案。
redis: 使用像 redis 这样快速的本地数据库在同一台机器上的进程之间共享对象,涉及使用简单的 put(key, data) 和 get(key),但你必须进行序列化和反序列化,可能使用 JSON。没有正式的并发控制,所以你必须确保任何对象的更改对所有客户端都是可用的。一种方法是使用 redis 内置的 pub/sub 来在更改发生时触发。另一种方法是使用乐观锁。
Unix 套接字 对于需要在不同技术之间共享对象的项目,例如在 C++ 应用程序和 Node 之间,Unix 套接字提供了一个非常快速的解决方案。你仍然需要进行序列化/反序列化并控制并发,但它比数据库解决方案更快,并且可以跨不同技术工作。有一个 Node 项目可以帮助处理其中的一些细节。
scuttlebutt 可能是在不同机器上的进程之间共享数据的最佳方式。 来自 scuttlebutt 网站:
Scuttlebutt 旨在被子类化为多种数据模型。提供了两个实现作为示例:scuttlebutt/model 和 scuttlebutt/events...
还有一篇很好的白皮书,阐述了使用复制来共享对象数据背后的科学原理。
我希望这能为你提供一些可行的替代方案。
答案#2
我大约在四五天前看到了你的回答,然后决定做一些正好可以做那个的东西
https://npmjs.com/package/webject
这个包可以实现对象在网络上的共享
一个对象可以通过 serve 托管,或通过 connect 连接
获取类似的两个函数
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)
