如何在没有 redis 的情况下扩展 socket.io

2024-04-14

我目前正在寻找一种替代方案来使用 socket.io 扩展我的 Express 应用程序。问题是我不想使用 redis 作为 socket.io 存储。除了使用之外,是否还有其他可能性来集群 socket.io集群集线器 https://github.com/fent/clusterhub?

编辑:我尝试使用法雷迪斯 https://github.com/hdachev/fakeredis作为redis的替代品,但它似乎不适用于socket.io。从ActionHero.js https://github.com/evantahler/actionhero我知道 faye-websocket 可以与 fakeredis 配合使用。


这很可能取决于您的 socket.io 使用情况以及您想要实现的扩展类型(集群与扩展到多台机器)。

因此,我所做的就是将 socket.io 的使用扩展到多个服务器。

我们在负载均衡器后面有 3 个服务器,当套接字连接时,它会连接到 3 个服务器中的任何一个,这三个服务器在内存中具有套接字列表,并且三个服务器具有内部服务器地址的顺序列表,例如[服务器1、服务器2、服务器3]。

我所做的基本上是一个环(内部我们称之为“套接字环”):

  • 如果我需要从 server1 向套接字发出事件,我首先查看套接字是否连接到该 server1,如果没有,我将向下一个服务器(server2)发送 http 请求,该服务器将检查套接字是否存在,如果不存在在那里它将向 server3 发送相同的请求,依此类推,直到到达原点,在这种情况下您可能会抛出错误。
  • 如果我需要广播消息,它几乎是相同的,我从一台服务器开始,然后调用其他服务器上的 http 端点。

我用来确定下一个节点(next_node.js)的算法是:

var nodes = process.env.NODES.split(',');
//this is usually:  http://server1/,http://server2/,http://server3/

var url = require('url');
var current = require("os").hostname();

//origin is the node that started the lookup
exports.get = function (origin) {
  var next_node_i = nodes.map(function (uri) {
    return url.parse(uri).hostname;
  }).reduce(function (prev, curr, i, arr){
    return curr === current && i < arr.length - 1 ? i + 1 : prev;
  }, 0);

  var next_node = nodes[next_node_i];

  if (origin && url.parse(next_node).hostname === origin) {
    // if the next node is equal to the first node initiating the lookup
    // it means the socket we are looking for is not connect to any node.
    return null;
  }

  return next_node;
};

Caveats:

  • 这些服务器之间的延迟很低,并且网络分区不太可能,它们物理上位于同一数据中心。但如果是网络分区对我们来说就没那么重要了。
  • 我们总是朝同一个方向跑环。改进的版本将是双向运行(?)
  • 服务器共享一个秘密来调用这些端点。

在我看来,这是在许多 socket.io 用例中实现扩展的一种非常简单的方法,可能在很多其他场景中这不是一个选项,但我希望这能提供一些想法。

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

如何在没有 redis 的情况下扩展 socket.io 的相关文章

  • 创建猫鼬模型时无法读取未定义的属性“用户”

    我正在尝试创建一个猫鼬模型并使用它从 mongodb 获取数据 但出现异常 我的 package json 中的猫鼬版本是 猫鼬 4 5 5 TypeError Cannot read property users of undefined
  • Node + Express 与静态 HTML。如何将所有请求路由到index.html?

    我正在开发一个单页 Web 应用程序 使用 Node Express 和 Handlebars 进行模板化 目前 index html 的一切都运行良好 它由一个非常标准的 server js 文件提供 var express requir
  • Node.js 有水豚吗?

    有谁知道 Node js 是否有类似 capybara 的东西 怎么样Zombie http zombie labnotes org 僵尸 js 使用 Node js 进行极其快速的无头全栈测试 The Bite 如果你要编写一个速度极快的
  • 节点检查器显示对象“无属性”

    我在调试场景中相当陌生 尤其是节点检查器 安装节点检查器后 我使用 debug 参数启动了简单的节点应用程序 并且能够在 localhost 8080 debug port 5858 处看到调试视图 当我让应用程序在此断点处停止时 rout
  • 在node.js中使用pug在表单“post”之后发送空的{}

    我正在尝试使用 fetch 和以下 pug 代码通过 post 将表单数据从登录页面传递到登录页面 form id form login input type text name email value placeholder Tu ema
  • MongoDB,从数组中删除对象

    Doc id 5150a1199fac0e6910000002 name some name items id 23 name item name 23 id 24 name item name 24 有没有办法从数组中提取特定对象 IE
  • 如何从控制器返回 PDF 文件

    我正在尝试使用 NestJs 从控制器端点返回 PDF 文件 未设置时Content typeheader 返回的数据getDocumentFile 很好地返回给用户 然而 当我添加标头时 我得到的返回似乎是某种奇怪形式的 GUID 响应总
  • 将 html2pdf 生成的 pdf 发送回服务器

    我必须使用以下命令发送客户端生成的 PDFhtml2pdf到服务器 我已成功将生成的 PDF 转换为 base64 并希望使用axios 这是我的客户端代码 function myFunction var element document
  • 如何使用 Stripe 在一次操作中创建客户和卡片?

    我正在尝试第一次初始化客户 我有一个表格 他们可以在那里注册和填写所有内容 然后他们提交 在客户端上 会发生以下情况 var cardValues AutoForm getFormValues credit card form insert
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • Visual Studio 代码断点在使用 TypeScript 的 Node.js 上不起作用

    我尝试了很多解决方案 但没有人适合我 代码执行 但我无法放置断点并调试它 请你帮助我好吗 我尝试过以下 VSCode 配置脚本 type node request launch name Typescript Node JS program
  • Typescript 找不到模块

    我在 Typescript 的一个文件 upload ts 中有一个导出的模块 我无法在没有错误的情况下导入到另一个文件 application ts 中 另外 我无法导入 ExpressJS 这是Upload ts
  • express 或express-generator:我需要两者吗?

    只是探索 Node js 并遇到了 Express 在 npm 存储库站点上https www npmjs com package express https www npmjs com package express它明确指出安装是 np
  • Sequelize.js - “不关联到”

    我在从数据库获取完整数据时遇到一些问题 那是我的模型 User module exports function sequelize DataTypes return sequelize define user id type DataTyp
  • ExpressJS - DELETE 请求后 res.redirect

    我一直在寻找如何执行此操作 我正在尝试在发出删除请求后重定向 这是我正在使用的代码没有重定向 exports remove function req res var postId req params id Post remove id p
  • 重写规则,以便正确加载具有绝对路径的 css 和 js 文件

    我花了两个小时 但我无法弄清楚 我不知道如何谷歌解决方案 这是我在 htaccess 文件中的重写规则 RewriteCond REQUEST URI blog RewriteRule blog http localhost 2368 1
  • npm install 命令下载所需包的源位置是什么?

    我试图获取命令 npm install 尝试连接的源位置 URL 并根据 package json 文件获取要下载的依赖包 并将其放置在本地框中 从下面提到的网址 http www tutorialspoint com nodejs nod
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • S3.getSignedUrl 接受多种内容类型

    我正在使用react s3 uploader节点包 它接受一个signingUrl用于获取用于将对象存储到 S3 中的signedUrl 目前 我已经配置了一个 lambda 函数 带有 API 网关端点 来生成此signedUrl 经过一
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16

随机推荐