带有mongodb和nodejs的实时networking应用程序

我一直在想如何使用nodejs / socket.io / mongodb制作一个实时的Web应用程序。 这个想法非常类似于谷歌文档,其中在一个页面上编辑的对象被发射并在所有客户端浏览器上重新渲染。

什么是最好的方式去做这个? 从我读过的,我可以想到3种方法:

1)使用mongodb oplogs

为MongoDB集合添加一个“侦听器”,每当对集合进行更改时,都会重新渲染页面的某些部分(缺点:慢?)

2)使用本地json

检索mongodb数据到json文件中,使用fs编辑,保存到mongodb并删除json完成后(缺点:在数据库和实际应用程序之间有额外的层)

3)使用纯粹的socket.io

无需存储即可保存,仅在所有更改完成后保存(缺点:在所有浏览器中文件可能无法正确显示)

有没有更好的方法来实现这一目标? (谷歌文档如何工作?)真的很感谢任何人都可以提供的帮助!

我们去年创build了一个实时应用程序,基本上是作者在同一页面上添加/删除/编辑元素(文本,图像,video等)的工具。

我们使用的是:

  • Node.js,带有Hapi.js框架(基于快车)
  • Socket.io
  • 没有 MongoDB,而是真棒RethinkDB,而这是默认实时,基本上使用监听器告诉你什么时候发生了变化。 (mongoDB在我们看来很糟糕,过去我们用它,感觉就像“再也不会”,但这就是我们的意见)
  • React / Redux是为了只更新已经改变的元素的DOM,而Angular的双向操作在我们看来并不奏效,因为一些用户可能同时修改同一个页面,因此重新渲染所有的元素会导致失去焦点。

说实话,它的速度有多快。

这很容易解决,没有太多的复杂性,并将文件保存到数据库。 您应该只保存文档位置。 Node为这种应用程序构build了一些非常棒的function。 我build议你看看这些话题:

  • EventEmitters

  • stream

节点文件系统具有可用于构build文档的类:

  • fs.FSWatcher

  • fs.ReadStream

  • fs.WriteStream

您可以使用socket.io将这些事件连接到您的客户端应用程序。

我会select1和3,但略有不同。 1.第一个selectmongoDB opLog的方法是很好的select,但是数据库的开销会变得非常大,你的应用程序将会进行数百万次交易。 meteorJS图书馆已经在这样做,你可以探索它们,因为它们比成熟和稳定的使用要比编写我们自己的服务。

  1. 选项3使用socket.io。 如果您使用的是支持本地更改的rethinkDB,则实际上可以使用socket.io进行发布更改以及写入数据库。 Native Changefeeds的意思是,每当有一个要实时观看的表/集合的写入时,就会使用新旧数据进行callback,您可以使用socket.io发布到所有客户端。
  2. 另一种方法是使用rabbitMQ,就像保罗上面提到的那样。

如果我这样做,我可能会使用混合。 Redis或rabbitmq来pipe理socket.io连接列表,尽可能快地获得发布和订阅行为,定时器作业定期将文档的写入刷新到mongodb以获得更长期的持久性,尽pipe有争议的是您可以将所有文档在Redis中,如果你想的话。

我认为使用socketIO同步数据是最好的方法…发送数据到mongo与发射。 使用套接字监听数据库中的更改,并使用此更改重新显示页面。

您也可以访问nodejs实时mongodb ! 看看如何自动与雷吉纳同步数据。