我一直在考虑如何使用nodejs / socket.io / mongodb创建实时Web应用程序。这个想法非常类似于谷歌文档,其中在页面上编辑的对象在所有客户端浏览器上发出并重新呈现。
这样做的最佳方法是什么?从我读过的内容中我可以想到3种方式:
为mongodb集合添加一个'listener',每当对集合进行更改时都会重新呈现部分页面(缺点:慢?)
将mongodb数据检索到json文件中,使用fs进行编辑,保存到mongodb并在完成时删除json(缺点:在数据库和实际应用程序之间有额外的层,很麻烦)
重新渲染而不存储,仅在完成所有更改后保存(缺点:文件可能无法在所有浏览器中正确呈现)
有没有更好的方法来实现这一目标? (谷歌文档如何工作?)非常感谢任何人都能提供的任何帮助!
答案 0 :(得分:21)
我们去年制作了一个实时应用程序,基本上是作者在同一页面上工作的工具,他们可以添加/删除/编辑元素(文本,图像,视频等)
我们使用的是:
老实说,它的速度非常棒。
答案 1 :(得分:3)
这很容易解决,没有太多的复杂性并将文档保存到数据库。您应该只保存文档位置。 Node为这种应用程序构建了一些非常棒的功能。我建议你研究这些主题:
EventEmitters
流
节点文件系统具有可用于为文档构建此类的类:
您可以使用socket.io将这些事件连接到客户端应用程序。
答案 2 :(得分:2)
我会选择1& 3但略有不同。 1.尾部mongoDB opLog的第一个选项很好,但是在你的应用程序将进行数百万次交易的数据库上,开销变得非常大。 meteorJS库已经在做这个了,你可以探索它们,因为它们比成熟和稳定使用,而不是编写我们自己的服务。
答案 3 :(得分:1)
如果我这样做,我可能会使用混合物。 Redis或rabbitmq管理socket.io连接列表以尽快获得发布和订阅行为,定时器作业定期将文档的写入刷新到mongodb以获得更长期的持久性,尽管可以说你可以保留所有文档在Redis如果你想要的话。
答案 4 :(得分:1)
“构建协作文档编辑应用程序”实际上是“ Mastering Node.js”一书中的一章。他们使用:
ShareDB是基于JSON文档的操作转换(OT)的实时数据库后端。它是DerbyJS Web应用程序框架的实时后端。 https://github.com/share/sharedb
Wave是托管的结构化文档,允许进行无缝且低延迟的并发修改。为了提供这种现场体验,Google Wave使用了并发控制的操作转换(OT)框架。 https://svn.apache.org/repos/asf/incubator/wave/whitepapers/operational-transform/operational-transform.html
Quill是一种现代的WYSIWYG编辑器,旨在实现兼容性和可扩展性。 https://github.com/quilljs/quill
WebSocket和websocket-json-stream
GitHub源代码的完整源代码:https://github.com/PacktPublishing/Mastering-Node.js-Second-Edition/tree/master/Chapter06/sharedb
此外,MongoDB最近还发布了有关使用Apache Kafka进行数据流传输以实现实时功能的白皮书:https://webassets.mongodb.com/kafka_and_mongodb.pdf
答案 5 :(得分:-2)
我认为使用socketIO同步数据是最好的方法...... 使用emit将数据发送到mongo。 使用套接字监听数据库中的更改,并使用此更改重新呈现页面。
您还可以访问nodejs realtime mongodb!了解如何使用regina自动同步数据。