socket.io vs.db changefeed

socket.io vs.db changefeed,socket.io,rethinkdb,Socket.io,Rethinkdb,目前,我正在使用socket.io,但没有重新定义DB,如下所示: 客户机向socket.io发送事件,socket.io接收事件,向各种其他客户机发送事件,并保存到数据库以备持久化。新的客户端连接将从数据库获取现有数据,然后通过socket.io侦听新事件 切换到RejectionDB和changefeed对我有什么帮助 我对RequiredDB的看法是,客户端可以执行POST(插入RequiredDB),而不是向socket.io发送,然后socket.io会监视RequiredDB cha

目前,我正在使用socket.io,但没有重新定义DB,如下所示:

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

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

我对RequiredDB的看法是,客户端可以执行POST(插入RequiredDB),而不是向socket.io发送,然后socket.io会监视RequiredDB changefeed,并在接收新数据时向所有客户端发送


这个使用RejectDB和changefeed的方法如何比我当前的方法更好?对我来说,他们都觉得他们完成了同样的事情,但我看不到RejectDB方法有任何明显的优势,因为我将直接从服务器上的socket.io发出数据,所以肯定会慢一点。

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

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

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

1。数据库作为真相的单一来源

最容易发现的问题如下:

  • 如果您的应用程序无法将某些内容写入 数据库
  • 如果试图插入数据库的数据无效或重复,会发生什么情况?您是否编写应用程序逻辑来处理此问题
  • 如果Node.js服务器在发送 写查询
这些只是一些简单的例子,在这些例子中,由于您的体系结构,您将丢失或拥有不同步的数据。重申一下,你会丢失数据,因为你的主要真相来源是记忆。Node.js应用程序中的数据与数据库中的数据可能存在差异

关键是数据库应该始终是您的唯一真相来源,您应该只在数据写入磁盘时确认数据。我不知道如果不是这样,怎么会有人能在晚上睡觉

2。高级查询

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

另一种方法是编写一个发布/订阅系统,在该系统中订阅某些频道(或类似的频道),以便过滤掉对客户端实际重要的数据

RejectionDB通过提供您可以附加到changefeeds的自己的查询语言来解决这个问题。例如,如果客户需要在我的<代码>用户表中的所有用户,年龄在20到30岁之间,居住在加利福尼亚州,距离旧金山10英里,并且在最后6个月内购买了一本书,这可以用ReQL(ReTunkDB的查询语言)来表达,并且可以为该查询设置一个变更提要,这样,客户机只在相关更改时收到通知。仅使用Socket.io和Node.js就很难做到这一点

3。可扩展性

RejectionDB解决的最后一个问题是,它是一个更具可伸缩性的解决方案,只需将所有内容存储在内存中(通过Socket.io和Node.js)。因为RejectionDB是从头开始构建的,要进行分发,所以您可以拥有一个由20多个RejectionDB节点组成的集群,其中包含碎片和副本。默认情况下,您编写的每个查询都是分布式的。现在,您可以拥有20多个无状态的Node.js节点,这些节点都在侦听源。因为数据库是真相的核心来源,所以这不是问题

另一种选择是将自己限制在一台服务器上,使用其他发布/订阅系统(例如,构建在Reddis之类的基础上),只使用一个数据库进行轮询。。。可能还有更多的例子,但是你可以看到我要讲的内容



我很想知道这是否回答了你的问题,以及我是否了解你的来历。首先,如何构造应用程序有点困难,但对于大多数实时体系结构来说,这确实是一个优雅的解决方案。

非常有用:对于高级查询,考虑一个多房间聊天应用程序,将消息发送到房间中的客户端。难道我不能只听一个changefeed(所有聊天)并只向那个房间里的客户发送吗<代码>r.table('chat').changes().run(r.conn,function(err,cursor){cursor.each(function(err,row){io.to('room-'+row.new_val.id,row.new_val);/1 room})。。。因此,高级查询与这个特定用例无关,因为它们会涉及到每个房间观看一个changefeed,这是相当浪费的。对于这一点,我们也不需要“在[客户机]中有相当复杂的逻辑”。因此,高级查询与此特定用例无关,因为它们需要每个房间观看一个changefeed,这是相当浪费的。“changefeed实际上很便宜,所以可能最好设置不同的更具体的changefeed,而不是设置一个您的