【问题标题】:Server to Client communication in Nodejs?Nodejs中的服务器到客户端通信?
【发布时间】:2020-01-17 23:37:06
【问题描述】:

我有一个 Nodejs 应用程序,它使用 Mysql 作为数据库、快递和护照来管理用户身份验证。一次可以有 20-30 个用户连接到我的 Nodejs 应用程序。

现在,在我的应用程序中的某些页面中,多个用户可以同时处理相同的内容。因此,如果一个用户更改了字段的值,其他用户也会看到该更改。到目前为止,为了实现这一点,我只是使用每 5 秒运行一次的 Setinterval 函数,向 Nodejs 服务器发送一个 ajax 请求,然后在必要时重新绘制用户字段。到目前为止,这一切都很好,但现在我已经决定,我希望我的应用程序中的其他页面也能以这种方式工作。这意味着我的 Nodejs 服务器每秒钟都会发生多次回发以运行 mysql 查询。我是 Nodejs 的新手,我不确定这是否是处理这种情况的最佳方式。

如果有一种方法可以向客户端发送新的字段数据,而无需客户端请求并为它们重绘 DOM,我正在徘徊。

【问题讨论】:

  • 从服务器到客户端的事件驱动更新?听起来 websockets 可以很好地解决问题
  • 旁注:据我所知,没有人以这种方式进行并发管理;如果用户下载的旧属性已被其他人更改,而第一个用户打开它们进行编辑,则通常的模式是拒绝保存。用谷歌搜索的术语来说,它被称为“乐观并发”,并且比实施一个系统更便宜和更有效,用户看到其他人在他们正在编辑年龄的同一记录中输入新员工姓名。
  • @CaiusJard - 听起来您还没有使用为同时多用户使用而设计的现代工具。只需查看两个人打开相同共享文档的 Google 文档。我们既可以编辑文档,也可以实时查看对方的编辑。它非常有用,是一种更现代的协作方式,而不是编辑、保存、发送给其他人或编辑、保存因未连接的编辑而被拒绝。
  • @jfriend00 我认为他的观点是操作转换真的很难,而且简单地阻止对错误版本的文档的更新更便宜/更容易。并不是说它不应该/不能做。
  • @Brad - 在 OP 描述的系统中,他们只是希望其他编辑者看到已经提交到数据库的更改,因此他们总是在查看数据库中的最新数据,所以他们是他们在查看已更改的旧数据时不太可能进行编辑。在许多系统中,这是一个非常理想的可用性特性,不应该被忽视,因为对用户不友好的实现更容易编码。这正是我们获得不良客户端/服务器应用程序的原因。

标签: mysql node.js


【解决方案1】:

浏览器内置了两种解决方案,供服务器直接向连接的客户端发送数据。

  1. webSocket connections
  2. Server sent events

使用这些技术中的每一种,客户端都会在任何给定的网页上建立这两种类型的连接之一,然后服务器就可以随时发送客户端数据。

webSockets 是两种方式的通信渠道。服务器发送的事件是单向的(数据从服务器发送到客户端)。服务器发送的事件被设计为更高效,但它们的功能受到更多限制。

重要的是要意识到客户端和服务器之间的持久连接仅在浏览器中当前页面的持续时间内。如果最终用户切换到另一个网页(甚至是您网站上的另一个页面),那么浏览器将关闭您当前的连接。如果该新网页需要类似的连接,则它会在新页面上建立新连接。

通过从浏览器到服务器的这些类型的连接,您的服务器会跟踪每个连接以及每个连接的一些识别信息(例如用户名或用户 ID)。然后,当服务器上的数据发生更改时,您的服务器可以确定哪些客户端应该收到该更改的通知,并通过它们的连接发送新数据。然后客户端接收该数据并使用 Javascript 更新网页的视觉效果(显示新数据、更新状态等)。

仅供参考,还有一个名为 socket.io 的流行库,它工作在 webSocket 之上,并添加了许多有用的功能 outlined here(例如连接故障检测、自动重新连接、消息传递层等...... )。您将在客户端和服务器中使用 socket.io 库来添加这些功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多