【问题标题】:Node.js best socket.io practice (request-response vs broadcast)Node.js 最佳 socket.io 实践(请求-响应 vs 广播)
【发布时间】:2014-01-03 05:48:25
【问题描述】:

我是 node.js/socket.io 的新手,可能没有以正确的方式提出这个问题,甚至没有提出正确的问题。

我的应用程序的目标是从 API 获取数据并将其转换为 JSON 对象并将其存储在 mongodb 中。然后在需要时为客户端提供数据。我考虑了两种可能性,并想知道最佳做法是什么。我的第一个想法是每隔一段时间向所有连接广播数据库中的所有条目。另一个想法是让客户端请求服务器它需要什么数据,然后将请求的数据发送给客户端。

存储在数据库中的数据大约有 100 个条目。数据将大约每 30 秒从 API 更新一次。如果选择方法 1,数据将每 5-10 秒广播一次。如果选择方法 2,则数据将在请求时发送。客户端将有不同的情况,其中并非始终需要所有数据。客户端必须经常请求数据以确保数据是“新鲜的”。

所以我的问题是最好的做法是每 x 秒广播一个大块或在请求时广播较小的块。

对不起,如果这没有意义。 感谢您的宝贵时间。

【问题讨论】:

  • 我建议查看Meteor 的发布/订阅系统及其DDP protocol。这个想法是服务器发布某些数据,然后客户端订阅一些数据。服务器向客户端发送它需要的数据,只有在实际发生更改时才会发送更新。
  • 感谢您的建议,我会检查一下。整个系统看起来有点重,但是实现 DDP 协议很有趣。

标签: node.js mongodb socket.io


【解决方案1】:

DDP 协议绝对是一种有趣的方式,但它可能有点矫枉过正。更简单的解决方案是充分利用方法 1 和 2。如果延迟不是那么重要并且您有空闲带宽,您可以在新数据到达时向所有客户端广播“更新”消息。客户端考虑更新是否影响它并下载它需要的数据。

稍微复杂和有效的方法是订阅过程非常类似于 DDP。对于较小的项目,您可以在一段时间内自己实现它。这就是它的工作方式:

  • 客户端订阅了一大块数据。
  • 服务器将此块发送给客户端并记住哪些客户端订阅了哪些内容。
  • 如果块被更新,服务器将通过订阅列表并将新数据发送给订阅者。
  • 客户端可以随时通过发送特殊消息、断开连接(或通过订阅不同的块)来取消订阅。

我所说的块是指如何识别某些数据的任何方式。它可以是记录 ID、时间范围、过滤器或任何对您的项目有意义的内容。

【讨论】:

  • 感谢您的回答。我正在考虑使用“房间”实现来区分哪些用户得到了什么。您知道这是否是存储客户端以获取某些数据的好方法吗?
  • 抱歉,我不知道房间实施是关于什么的。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2016-03-25
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2021-05-07
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多