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

时间:2014-08-27 05:11:22

标签: javascript node.js

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

如果那不可能,那么任何想法如何开销呢?

2 个答案:

答案 0 :(得分:3)

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

  1. 如果服务是节点集群,则是leveldb或redis等快速数据库。
  2. 如果服务在同一台机器上但作为单独的进程运行,则redis或unix套接字可以正常工作。
  3. 如果服务分布在多台计算机上,则scuttlebutt提供了一个很好的解决方案。
  4. redis:使用像redis这样的快速本地数据库在同一台机器上的进程之间共享对象涉及使用简单的put(key,data)和get(key),但是你必须序列化和反序列化,可能使用JSON。没有正式的并发控制,因此您必须注意所有客户端都可以使用任何对象更改。一种方法是使用内置于pub / sub中的redis来进行更改时触发。另一种方法是使用乐观锁定。

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

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

      

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

    还有一个很好的white paper解决了使用复制来共享对象数据的科学原理。

    我希望这会给你一些可行的选择。

答案 1 :(得分:0)

大约 4 或 5 天前我看到了您的回答,并决定为此做点什么

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)