如何在Node.js服务器上实现多客户端数据同步

8
以下图表是我正在创建的一个基本Web应用程序的表示。

Node.js Web Application Schematic

应用程序的基本操作如下:
  1. 客户端向Node.js服务器发送数据请求。
  2. 服务器接收请求。
  3. 服务器从数据库中获取数据。
  4. 服务器将数据作为JSON字符串发送回客户端。
  5. 客户端接收数据并将其存储为JSON对象,然后将其绑定到表格上。
这一切都很好地运作。我遇到的问题最好通过以下情况来表示。
  1. 客户端1至4都完成了上述步骤(即所有人都有一个绑定到JSON对象的数据表)。
  2. 现在,客户端1向服务器发送更新请求。
  3. 服务器接收请求。
  4. 服务器更新数据库。
  5. 服务器向客户端1发送响应,指示成功操作,并更新绑定到表格的JSON对象。
  6. 问题:客户端2至4上显示的JSON数据现在与数据库不再同步。
因此,我的问题是如何使我所有4个(或更多)客户端上的JSON数据与我的Node.js服务器上的数据库实时同步?

1
已经有整本书和许多博士论文写过所有类型的同步策略。使用哪种取决于很多因素(用例、数据更改数量、客户端离线频率、冲突策略、数据集大小等)。客户端1、2、3、4是否总是在线?还是他们上线然后必须更新他们的同步?此外,您真的必须将所有数据都存储在本地吗?云服务的一个优点是维护单个中央存储库,并根据需要让客户端查询它。 - jfriend00
1
简要来说,你需要在某些东西发生变化时通知客户端。尝试寻找Websockets,网上有很多好的教程。基本上,一个Websocket是服务器和客户端之间的通信渠道。你应该做的是向客户端发送关于发生了什么变化的通知,然后每个客户端都应该确定它是否需要更新某些内容(并请求信息)或不需要更新。 - Facundo La Rocca
2
你的问题实际上与node.js服务器没有关系,而与数据存储和我之前评论中列出的所有其他问题有关。如果客户端始终在线,您可以从每个客户端创建一个WebSocket连接到node.js服务器,然后每当任何客户端对数据存储进行更改时,您都将该差异发送到所有其他客户端。但是,如果任何客户端离线一段时间,那么当它重新上线时,您必须发明一种追赶策略。如果您在谷歌上搜索“数据同步策略”,则会有很多阅读材料。 - jfriend00
@Fac 是的,我一定会为你点赞。至于采纳答案,你能否在回答中加入一些关于与node.js一起使用的特定Web套接字库或甚至是实现此功能的示例服务器代码的信息? - Josh
1
我已编辑我的回答,以提供最好的WebSockets库之一。您将找到客户端、服务器和演示的示例。我强烈建议您不仅要在项目中从头开始构建,还要构建一个可运行的示例,以了解WebSockets是什么,它们如何工作以及您确切需要什么。完成后,继续将其应用于您的项目。 - Facundo La Rocca
显示剩余3条评论
3个回答

4
简单来说,您需要在某些变化发生时通知客户端。尝试寻找Websockets,网络上有很多好的教程。基本上,Websocket是服务器和客户端之间的通信渠道。您需要做的是向客户端发送有关已更改的通知,然后每个客户端都应确定是否需要更新某些内容(并请求信息)或不需要更新。
看一下这个库:https://www.npmjs.com/package/websocket 我认为它是最好的一个(如果不是最好的),您甚至会找到示例和演示。

这位小伙子要求同步,而你却谈论通信。祝你实现异步多线程读写对象顺利愉快,兄弟。 - Lodewijk
直接将更改发送给客户是否比通知客户然后再次获取更改并提出新请求更好? - Elbassel

2
我认为在2021年实现这一点的最佳方式是使用服务器推送事件。您的后端可以在接收到数据时向所有其他客户端发出服务器推送事件。SSE基本上是下游单向事件,浏览器可以像监听WebSocket一样监听它们。
然后,客户端只会与网络延迟不同步,这是不可避免的。
在我看来,SSE的唯一问题是其浏览器兼容性较低,因此它将破坏IE 11的支持。

0
如果你愿意接受全栈框架,Meteor 可以满足你的所有需求,使所有客户端视图与更改保持同步。
Meteor 是一个庞大的依赖项 - 它对你的技术选择在堆栈的每一层都有自己的看法 - 所以它并不适合每个人,但如果你想要快速结果,那就难以超越它。

听起来不错,但我看到这个堆栈已经预装了一个数据库。它能否被替换为我们已经预配置的MySQL数据库? - Josh
Meteor 是实际的数据存储同步还是仅保持客户端视图最新?OP 寻求数据存储同步。 - jfriend00
它使用基于Comet的发布/订阅机制,以使所有连接的客户端视图与任何客户端所做的更改保持同步。 - saille
@josh Meteor 在很大程度上基于 MongoDB,但是可能会有第三方支持 SQL。如果你要尝试 Meteor,我建议坚持使用 Mongo。 - saille
@saille 非常感谢!非常感谢您的帮助。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接