socket.io 与 RethinkDB 变更源

2024-02-25

目前我正在使用没有 RethinkDB 的 socket.io,如下所示:

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

切换到 RethinkDB 和变更源对我有什么帮助?

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

这种使用 RethinkDB 和变更源的方法比我当前的方法如何更好?对我来说,他们都觉得他们完成了同样的事情,但我没有看到 RethinkDB 方法有任何明显的优势,而且因为我会转到数据库而不是立即从服务器上的 socket.io 发出,所以它会肯定会慢一点。


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

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

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

1. 数据库作为单一事实来源

最容易发现的问题如下:

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

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

关键是数据库应该始终是您的唯一事实来源,并且您应该仅在数据写入磁盘时确认数据。我不确定其他人晚上怎么能睡得着觉。

2. 高级查询

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

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

RethinkDB 通过提供自己的查询语言来解决这个问题,您可以将其附加到变更源中。例如,如果客户需要我的所有用户users表中年龄在 20 岁到 30 岁之间,住在加利福尼亚州,距离旧金山 10 英里,并且在过去 6 个月内购买过一本书,这可以用 ReQL(RethinkDB 的查询语言)来表达,并且变更源可以为该查询进行设置,以便客户端仅在以下情况时收到通知relevant变化。仅使用 Socket.io 和 Node.js 很难做到这一点。

3. 可扩展性

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

另一种方法是将自己限制在一台服务器上,拥有其他一些发布/订阅系统(例如,基于 Reddis 之类的系统构建),只有一个可供轮询的数据库......可能还有更多示例,但您可以看到在哪里我就这样吧。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket.io 与 RethinkDB 变更源 的相关文章

  • 启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

    我有一个很大程度上基于此的服务器tutorial https www golinuxcloud com go grpc crud api postgresql db 在我对其应用了额外的更改后 它工作得很好 但现在我想添加socket io
  • 使用 Socket.IO 的 Python 客户端到 nodeJS 服务器

    我正在尝试使用 socket io 将值从我的树莓派 在 python 2 7 9 中 发送到我的 nodeJS 服务器 我的目标是通过 websocket 连接从我的 pi 连续发送许多值到我的节点服务器 本地 该服务器应该获取这些值并将
  • SocketIO ERR_CONNECTION_REFUSED

    我开始使用 NodeJS 和 Socket IO 我正在尝试使用 NodeJS http 服务器设置一个基本示例 并建立到服务器的 Socket IO 连接 我也在使用 Angular JS 基本上我想要的是 当用户按下按钮时 就会建立与服
  • Socket IO聊天例子很慢

    我是 Node js 和 Socket IO 的新手 我想尝试一下解释的示例 https socket io get started chat https socket io get started chat 我做了我必须做的一切 它起作用
  • 如何通过ajax点击时从javascript文件执行节点(控制台)命令

    我是 Node js 新手 这是我的问题 例如 我得到了 Web 应用程序 并且从该应用程序中我有一个按钮 单击按钮后我想运行节点控制台命令 例如 node socket io So button on click function run
  • WebSocket 连接失败:WebSocket 握手期间出错:意外的响应代码:400

    我正在尝试将 Socket io 与 Angular 集成 但在从客户端到服务器建立连接时遇到困难 我查看了其他相关问题 但我的问题发生在本地 所以中间没有网络服务器 这就是我的服务器代码的样子 const app express cons
  • 在node.js中使用socket.io设置服务器-服务器SSL通信

    我正在尝试使用 socket io 通过 ssl 连接来设置服务器到服务器的链接 这是我的例子 Server var app require express var config require config var https requi
  • 刷新后,socket.io 客户端多次侦听同一事件

    我得到了一个包含项目表的母版页 成功后表数据将不断刷新socket io与服务器的连接 单击表中的某个项目 该项目的 id 将传递到服务器 时 将使用 ajax 加载子视图 并通过侦听来自服务器的事件不断刷新该子视图 现在的问题是 通过选择
  • Socket.io 与服务器离线连接

    如何检测服务器是否离线或由于其他原因无法连接 我的代码看起来像这样 this socket io connect connectionInfo reconnect false 它不会抛出任何错误 因此 try catch 子句不起作用 Us
  • 如何使用 Typescript 的 socket.IO 客户端类型定义?

    我已经使用 SocketIO 客户端安装了 Typescript 定义 npm install types socket io client 但在 VS Code 中我仍然遇到类型错误 let socket SocketIOClientSt
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • Socket.io 最佳编码实践

    我正在开发一个 Node js 应用程序 它使用 Socket io 来处理实时通信 我的代码充满了 On 和 Emit 函数 我也使用房间功能 我的应用程序如下所示 var server require http Server var i
  • Nginx 和 Flask-socketio Websockets:存在但没有消息传递?

    我在让 Nginx 与 Python Flask socketio 库 基于 gevent 很好地配合时遇到了一些麻烦 目前 由于我们正在积极开发 我正在尝试让 Nginx 充当代理 对于发送页面 我可以通过直接运行flask socket
  • Node.js 请求随机开始挂起,直到服务器重新启动后才会清除

    我在我们的网络应用程序上遇到了一个非常奇怪且看似随机的问题 我似乎无法成功调试 它可以正常运行 10 分钟到 6 小时 然后突然无法向服务器发出或从服务器发出远程请求 它们只是挂起 这包括常规的 http 和 Web 套接字请求 奇怪的是
  • 将实时流音频从 NodeJS 服务器获取到客户端

    我需要从 1 个客户端到服务器到多个侦听器客户端的实时实时音频流 目前 我正在从客户端进行录音 并通过 socket io 将音频流式传输到服务器 服务器接收此数据 并且必须将音频流式传输 也通过 socket io 到想要收听此流的客户端
  • 从项目中的任何位置获取socket.io名称空间

    在我的 REST 调用和一些数据库插入之后 我想通过 socket io 向前端发出一个新的通知 如下所示 socket broadcast emit send notification notification 由于我执行此操作的函数是通
  • AWS应用程序负载均衡器和socket.io

    我有一个正在运行的 socket io 聊天室 当我们在一台机器上运行时 其流量越来越大 我们已经使用 ws 套接字库运行了基准测试 它们的性能确实要好得多 这将更好地利用我们的硬件 但这会以必须重写我们的应用程序为代价 我们的 socke
  • 如何使用ssl启动flask_socketio应用程序?

    我应该如何使用 SSL 将 app run 转换为 sockio run 我有下面的应用程序启动代码与 Flask 开发服务器一起运行 if name main app run ssl context ssl cert ssl key 我现
  • WebSocket如何压缩消息?

    JSON stringify 显然空间利用率不高 例如 123456789 123456789 占用 20 多个字节 而它可能只需要大约 5 个字节 websocket 在发送到流之前是否会压缩其 JSON WebSocket 的核心只是一
  • 有人在node/socket.io 中成功实现了动态命名空间吗?

    含义 用户对应用程序进行身份验证 gt 应用程序设置socket io连接的命名空间 http www socketioserver com NAMESPACE 并且节点服务器相应地响应无需针对特定名称空间进行硬编码 到那个特定的命名空间

随机推荐

  • Tensorflow 和 Keras 之间 Adam 的不同学习曲线

    我目前正在将代码从 Keras 更改为 Tensorflow 以便使用 Tensorflow 1 10 0 中量化训练的新功能 然而 我发现使用 Adam 优化器时 Keras 和 Tensorflow 中的训练过程显示出非常大的差异 下面
  • i386 架构的重复符号错误

    当我尝试构建时出现此错误 重复符号 Z8ERRCHECK11FMOD RESULT 位于 Users codemenmini2012 2 Library Developer Xcode DerivedData MagicSleepFullV
  • Asp.net身份Google帐户ID从openId迁移到oauth

    我有一个现有的 asp net mvc5 应用程序 使用 DotNetOpenAuth 进行 Google OpenId 身份验证 我正在迁移到 Asp Net Identity 并使用 Google Auth 和 OAuth2 0 但我发
  • WebBrowser 控件:导航至网页已取消

    Setup Windows 8 完整版 平板电脑 NET 2 0应用程序 我正在开发一个项目 其中加载应用程序时有 4 个 WebBrowser 控件同时导航到某个网页 这些网页具有相同的 HTML 但来自不同的 Web 服务器 问题是其中
  • Flutter Gradle 任务 assembleDebug 失败,退出代码为 1 zip END 标头未找到

    你好 我是 Flutter 新手 我已经使用 android studio 4 2 1 设置了 flutter 一切都很好 当我尝试运行它时 它向我显示以下错误 我看到太多问题 但对我没有帮助 flutter doctor 运行没有发现问题
  • 为什么这个 C++ for 循环的执行时间有显着差异? [复制]

    这个问题在这里已经有答案了 我正在检查循环 发现访问循环有显着差异 我不明白是什么导致了这两种情况的差异 第一个例子 执行时间处理时间 8秒 for int kk 0 kk lt 1000 kk sum 0 for int i 0 i lt
  • 如何验证 URL?

    我正在尝试使用 NSURL 验证 url 但它对我不起作用 Example func verifyUrl urlString String gt Bool if let urlString urlString if let NSURL st
  • 如何在二进制文件上将 AssemblyVersion 标记为 FileVersion

    我正在使用 Roslyn 功能从当前日期 时间生成版本号 https github com dotnet roslyn blob 916b15dbf6b7ef1b33391d5252a4905aacb6f488 src Compilers
  • 将 Microsoft Azure VM 移动到 vNet 内的不同子网

    我们能否使用 azure 新门户或 azure 经典门户将 Microsoft Azure VM 移动到 vNet 内的不同子网 如果无法通过门户 那么该怎么做 那么如何在创建后编辑虚拟机的属性 例如移动到不同的子网等 可以通过新门户实现
  • Js 或 jquery file.type.match 仅适用于 jpg 和 png

    如何使用 file type match 限制 mimetype 仅适用于 png 和 jpg 下面是我的代码 var fileInput document getElementById myfileinput files 0 if fil
  • 每个时期隐藏层的输出并将其存储在 keras 的列表中?

    我有一个带有单个隐藏层的 keras MLP 我正在使用多层感知器 在单个隐藏层中具有特定数量的节点 我想在一批通过时提取该隐藏层所有神经元的激活值 并且我想为每个时期执行此操作并将其存储在列表中以进行探索 我的表述如下 class myN
  • Cocoa:从另一个类调用应用程序委托方法

    我目前正在尝试通过自定义视图内的拖放操作获取文件的路径 然后将该路径传递给我的应用程序委托 我目前正在使用以下内容 BOOL performDragOperation id
  • 简单的 jQuery 文件上传插件(仅使用 iframe)

    我花了很多时间在网上搜索 找到一个非常简单和基本的 jQuery 插件 让我可以在不刷新页面的情况下上传文件 我不想要这些大插件及其所有花哨的技术 我希望它可以轻松添加到我的网站 所以我刚刚制作了自己的小 jQuery 插件来做到这一点 并
  • 如何通过管理方式使使用“记住我”选项的会话失效?

    我正在使用 Symfony 2 1 6 和 PdoSessionStorage 我正在尝试将 Facebook 具有的相同功能添加到我的应用程序中 您可以在其中向用户显示他们与网站的所有活动会话 显示基于 IP 的设备类型和位置 并允许他们
  • Javafx 表列使用比较器排序不起作用

    在 Java FX 中 我想在排序的 TableView 中显示此模型 public class ProfilZuordnungTableRowModel private int id private double kundenwert p
  • Facelets: ui:param 默认值

    如何为 Facelet 模板参数定义默认值 考虑使用模板参数的以下元素
  • 生成班级独有的 id 的有效方法?

    在 C 中是否有任何有效的方法来生成类唯一的 ID 而不是实例的 ID 我正在寻找这种简单程度的东西 这会为每个实例生成一个 ID 而不是为每个类类型生成一个 ID MyClass MyClass static unsigned int i
  • pthread 的条件等待

    我似乎遇到了 pthreads 条件变量可能出现的死锁 这是代码 thread function for condition do work should the thread continue if exit 1 break exit f
  • Firefox 打印额外的空白页

    我的网页可以在 Chrome Safari 和 IE 上正确打印 但在 Firefox 上出现以下问题 它仅在第一页上打印标题 其余部分是空白的 实际内容仅显示在第2页上 谷歌搜索了一下 我发现是 float left 样式造成的 如果我删
  • socket.io 与 RethinkDB 变更源

    目前我正在使用没有 RethinkDB 的 socket io 如下所示 客户端向 socket io 发送事件 socket io 接收事件 向其他各种客户端发送事件 并保存到数据库以进行持久化 新的客户端连接将从数据库获取现有数据 然后