使用mongodb和nodejs的实时网络应用程序

时间:2016-12-29 20:14:30

标签: node.js mongodb socket.io real-time

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

这样做的最佳方法是什么?从我读过的内容中我可以想到3种方式:

1)使用mongodb oplogs

为mongodb集合添加一个'listener',每当对集合进行更改时都会重新呈现部分页面(缺点:慢?)

2)使用本地json

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

3)使用purely socket.io

重新渲染而不存储,仅在完成所有更改后保存(缺点:文件可能无法在所有浏览器中正确呈现)

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

6 个答案:

答案 0 :(得分:21)

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

我们使用的是:

  • Node.js,带有Hapi.js框架(基于表达式)
  • Socket.io
  • 没有 MongoDB,但是真棒RethinkDB,默认是实时的,并且基本上使用听众来告诉你什么时候发生了变化。 (我们认为mongoDB很糟糕,我们过去使用过它,感觉就像“再也不会”,但这是我们的看法)
  • React / Redux只为已更改的元素更新DOM,我们认为Angular及其双向方式效果不佳,因为多个用户可能会同时修改同一页面,因此 - 渲染所有元素会导致失去焦点。

老实说,它的速度非常棒。

答案 1 :(得分:3)

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

  • EventEmitters

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

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

答案 2 :(得分:2)

我会选择1& 3但略有不同。 1.尾部mongoDB opLog的第一个选项很好,但是在你的应用程序将进行数百万次交易的数据库上,开销变得非常大。 meteorJS库已经在做这个了,你可以探索它们,因为它们比成熟和稳定使用,而不是编写我们自己的服务。

  1. 选项3使用socket.io。实际上,如果使用支持本机更改源的rethinkDB,则可以使用socket.io进行publishng更改以及写入数据库。原生更改意味着,每次有对要实时观看的表/集合的写入时,它都会使用旧数据和新数据进行回调,您可以使用socket.io将其发布到所有客户端。
  2. 另一种方法是使用RabbitMQ,这是一个更强大的解决方案,就像Paul上面提到的那样。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

“构建协作文档编辑应用程序”实际上是“ Mastering Node.js”一书中的一章。他们使用:

此外,MongoDB最近还发布了有关使用Apache Kafka进行数据流传输以实现实时功能的白皮书:https://webassets.mongodb.com/kafka_and_mongodb.pdf

答案 5 :(得分:-2)

我认为使用socketIO同步数据是最好的方法...... 使用emit将数据发送到mongo。 使用套接字监听数据库中的更改,并使用此更改重新呈现页面。

您还可以访问nodejs realtime mongodb!了解如何使用regina自动同步数据。