socket.io 对比 RethinkDB 变更提要

socket.io vs RethinkDB changefeed

目前我正在使用 socket.io 没有像这样的 RethinkDB:​​

客户端向 socket.io 发送事件,它接收事件,向其他各种客户端发送事件,并保存到数据库以进行持久化。新的客户端连接将从数据库中获取现有数据,然后通过 socket.io.

监听新事件

切换到 RethinkDB 和 changefeed 对我有什么帮助?

我认为与 RethinkDB 相同的工作方式是客户端可以执行 POST(插入 RethinkDB)而不是发送到 socket.io,然后 socket.io 正在监视一个 RethinkDB 更改提要并在收到新数据时发送给所有客户端。

这种使用 RethinkDB 和 changefeed 的方法比我目前的方法有何优势?对我来说,他们都觉得他们完成了同样的事情,但我没有看到 RethinkDB 方法有任何明显的优势,因为我会去数据库而不是直接从服务器上的 socket.io 发出肯定会慢一点。

首先,让我们澄清一下socket.io和RethinkDB changefeeds之间的关系。 Socket.io 用于客户端(浏览器)和服务器(Node.js)之间的实时通信。 RethinkDB changfeeds 是你的服务器(Node.js)监听数据库变化的方式。客户端无法直接与 RethinkDB 通信。

实时应用程序的一个非常典型的架构是让 RethinkDB changefeeds 订阅数据库中的更改,然后使用 socket.io 将这些更改传递给客户端。客户端通常还会发出可以写入数据库的消息,具体取决于您的应用程序逻辑。

是的,您可以通过 socket.io 发出所有消息,然后将所有消息传递给所有客户端,然后将这些消息写入数据库以进行持久化。这确实更快,但是这种方法有很多缺点。

1.数据库作为唯一的真实来源

最容易发现的问题如下:

  • 如果您的应用无法向 数据库?
  • 如果您尝试插入数据库的数据无效或重复,会发生什么情况?您是否编写应用程序逻辑来处理这个问题?
  • 如果 Node.js 服务器在发送之前宕机了会发生什么 写查询?

这些只是一些简单的示例,在这些示例中,由于您的体系结构,您将丢失或拥有不同步的数据。重申一下,您将丢失数据,因为您的主要真实来源是内存。您的 Node.js 应用程序和数据库中的数据也可能存在差异。

重点是数据库应该始终是您唯一的真实来源,您应该只在数据写入磁盘时确认数据。我不知道要不然怎么会有人晚上睡得着。

2。高级查询

如果您只是通过 socket.io 将来自所有客户端的所有新消息传递给所有客户端,那么您现在必须在客户端中使用一些非常复杂的逻辑才能过滤掉所有真正重要的数据。考虑到您正在通过客户端实际不会使用的网络传递大量无用数据。

另一种方法是编写一个 pub/sub 系统,您可以在其中订阅某些频道(或类似频道)以过滤掉对客户真正重要的数据。

RethinkDB 通过提供它自己的可以附加到变更源的查询语言来解决这个问题。例如,如果客户需要我的 users table 中年龄在 20 到 30 岁之间、居住在距旧金山 10 英里的加利福尼亚州并且购买了在最近 6 个月内预订,这可以用 ReQL(RethinkDB 的查询语言)表示,并且可以为该查询设置一个更改提要,以便客户端仅在 相关 更改时收到通知。仅使用 Socket.io 和 Node.js.

就很难做到这一点

3。可扩展性

RethinkDB 解决的最后一个问题是它是一种更具可扩展性的解决方案,只需将所有内容存储在内存中(通过 Socket.io 和 Node.js)。因为 RethinkDB 是从头开始构建的,所以您可以拥有一个包含 20 多个 RethinkDB 节点的集群,其中包含分片和副本。默认情况下,您编写的每个 RethinkDB 查询都是分布式的。现在,您可以拥有 20 多个其他 Node.js 节点,这些节点是无状态的并且都在监听 changfeeds。因为数据库是事实的中心来源,所以这不是问题。

另一种方法是将自己限制在一台服务器上,使用其他 pub/sub 系统(例如,建立在 Reddis 之类的东西上),只有一个数据库供您轮询...可能还有更多例子,但你可以看到我要去哪里。


我很想知道这是否回答了您的问题,以及我是否明白您的意思。一开始很难了解如何构建您的应用程序,但它确实是大多数实时架构的优雅解决方案。