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

Real-time web apps with mongodb and nodejs

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

执行此操作的最佳方法是什么?根据我的阅读,我可以想到 3 种方法:

1) 使用 mongodb 操作日志

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

2) 使用本地 json

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

3) 纯粹使用socket.io

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

有没有更好的方法来实现这个? (google 文档如何工作?)非常感谢任何人可以提供的帮助!

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

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

  • 事件发射器

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

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

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

  1. 使用选项 3 socket.io。如果您使用支持本机变更源的 rethinkDB,您实际上可以使用 socket.io 来发布更改以及写入数据库。本机 changefeeds 的意思是,每当你想实时观看 table/collection 的写入时,它都会提供一个包含新旧数据的回调,你可以在其中使用 socket.io 发布到所有客户端。
  2. 另一种更强大的解决方案是使用 rabbitMQ,就像 Paul 上面提到的那样。

我们去年构建了一个实时应用程序,基本上是供作者在同一页面上工作的工具,他们可以在其中 add/remove/edit 元素(文本、图像、视频等)

我们使用的是:

  • Node.js,使用 Hapi.js 框架(基于 express)
  • Socket.io
  • No MongoDB 但令人敬畏的 RethinkDB 相反,默认情况下它是实时的,基本上使用侦听器来告诉你什么时候发生了变化。 (mongoDB在我们看来很烂,我们过去用过它感觉像"never again",但这是我们的意见)
  • React/Redux 以便仅针对已更改的元素更新 DOM,我们认为 Angular 及其双向操作效果不佳,因为一些用户可能会同时修改同一个页面,因此重新渲染所有元素会导致失去焦点。

老实说,它的速度真是太棒了。

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

您也可以访问nodejs realtime mongodb!查看如何与 regina 自动同步数据。

"Building a collaborative document editing application"其实是书中的一个章节"Mastering Node.js"。他们使用:

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