- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我正在使用没有RethinkDB的socket.io,如下所示:
客户端将事件发送到socket.io,socket.io接收事件,将事件发送给其他各种客户端,并保存到db中以保持持久性。一个新的客户端连接将从数据库中获取现有数据,然后通过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 changfeed是服务器(Node.js)侦听数据库中更改的一种方式。客户端无法直接与RethinkDB通信。
实时应用程序的一个非常典型的体系结构是让RethinkDB changefeed订阅数据库中的更改,然后使用socket.io将这些更改传递给客户端。客户端通常还会发出可以写入数据库的消息,具体取决于您的应用程序逻辑。
是的,您可以只通过socket.io发出所有消息,然后将所有消息传递给所有客户端,然后将这些消息写入数据库以实现持久性。确实更快,但是这种方法有很多缺点。
1.数据库是真理的单一来源
最容易发现的问题如下:
如果您的应用程序无法向
数据库?
如果您要插入数据库的数据无效或重复,该怎么办?您是否编写应用程序逻辑来处理此问题?
如果Node.js服务器在发出警告之前关闭了,该怎么办
写查询?
这些只是一些快速的示例,在这些示例中,由于您的体系结构,您将丢失或丢失同步数据。只是重申一下,您将丢失数据,因为您的真相的主要来源是内存中。您还可能在Node.js应用程序中的数据与数据库之间存在差异。
关键是数据库应该始终是您的唯一事实来源,并且只应在将数据写入磁盘时对其进行确认。我不确定其他人晚上怎么能入睡。
2.高级查询
如果只是通过socket.io将所有新消息从所有客户端传递到所有客户端,则现在必须在客户端中包含一些非常复杂的逻辑,以便过滤出实际上非常重要的所有数据。考虑到您正在通过客户端实际上不会使用的网络传递大量无用的数据。
另一种方法是编写一个发布/订阅系统,在该系统中,您预订某些频道(或类似的频道),以便过滤出对客户来说实际上很重要的数据。
RethinkDB通过提供它自己的查询语言来解决此问题,您可以将其附加到changefeeds。例如,如果客户需要我的users
表中20至30岁之间的所有用户,这些用户居住在加利福尼亚州,距离旧金山10英里,并且最近6个月内购买了一本书,这可以用ReQL(RethinkDB的查询语言)表示,并且可以为该查询设置changefeed,以便仅在相关更改时通知客户端。仅使用Socket.io和Node.js很难做到这一点。
3.可扩展性
RethinkDB解决的最后一个问题是,它是一种仅将所有内容(通过Socket.io和Node.js)存储在内存中的可伸缩性更高的解决方案。由于RethinkDB是从头开始构建并可以分发的,因此您可以拥有一个由20多个RethinkDB节点组成的群集,其中包含分片和副本。默认情况下,您编写的每个RethinkDB查询都是分布式的。现在,您可以拥有20多个其他无状态的Node.js节点,它们都在监听changfeed。因为数据库是真理的主要来源,所以这不是问题。
另一种选择是将自己限制在一台服务器上,拥有其他发布/订阅系统(例如,基于Reddis构建),仅轮询一个数据库...可能还有更多示例,但是您可以看到哪里我要用这个。
我很想知道这是否回答了您的问题,以及我是否知道您来自哪里。首先,如何构造应用程序有点困难,但是对于大多数实时体系结构而言,这确实是一个优雅的解决方案。
关于socket.io - socket.io与RethinkDB changefeed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527698/
我想知道是否有人可以解释如何将我的 changefeed 游标值解码为特定的结构类型。 var message map[string]interface{} for chatFeedCursor.Ne
我正在使用 Clojure driver for RethinkDB . 我想从查询中获取更改提要。这是我到目前为止所拥有的: (defn change-feed [conn] (loop [ch
目前,我正在使用没有RethinkDB的socket.io,如下所示: 客户端将事件发送到socket.io,socket.io接收事件,将事件发送给其他各种客户端,并保存到db中以保持持久性。一个新
我知道我可以订阅以收听执行此操作的表上的更改 r.table('users').changes().run(conn, function(err, cursor) { cursor.each(co
全部, 我正在使用 Change Feed Processor Library。想知道处理服务失败的最佳方法以及 ProcessChangesAsync 方法中的异常/错误场景。以下是我所指的事件。
我希望使用 RethinkDB changefeeds 创建一种“时间触发”: return r. Table("Checks"). F
当我浏览MSDN documentation时我所能看到的只是“观察”ChangeFeed 上的变化。即使是第一个图表也仅显示了从外部服务(Storm、Azure Functions 等)到Chang
我有一个 Azure 函数,我正在尝试使用 Azure ServiceBus 传输通过 NServiceBus 发送消息。 我已经成功地按照 this doc 让它工作了当端点名称没有“.”时或名称中
我是一名优秀的程序员,十分优秀!