node.js - 从 Redis 检索 Socket.io 客户端

标签 node.js redis socket.io scale

我正在构建一个实时数据系统,它允许 Apache/PHP 服务器将数据发送到我的 Node.js 服务器,然后该服务器会立即通过 socket.io 将该数据发送到关联的客户端。因此,Apache/PHP 服务器发出一个包含数据的请求,以及一个用户 token ,告诉 Node.js 将数据发送给哪个用户。

现在这工作正常 - 我有一个关联数组,将用户的 socket.io 连接与其用户 token 联系起来。问题是我需要开始将其扩展到多个服务器。自然地,使用 socket.io 的默认配置,我无法在 Node worker 之间共享连接。

我想到的解决方案是使用 RedisStore 功能,让我的每个员工都查看同一个 Redis 存储。我一直在做研究,有很多关于如何使用发布/订阅功能向大型团体(房间)广播消息的文档。这很好,但我需要能够将消息发送到单个客户端,因此我需要一些方法来从 RedisStore 检索用户的 socket.io 连接。

我现在能想到的唯一方法是创建大量以用户 token 命名的“房间”,并且每个房间只有一个用户。然后我就可以发射到那个房间了。但是,这似乎效率很低。

有没有更好的方法可以从 Redis 检索用户的唯一 socket.io 连接?

最佳答案

一旦与运行 Node 服务器的服务器建立套接字连接,它就会连接到该实例。

因此看来您需要为您的 php 服务器提供一种方法来了解客户端连接到哪个 Node 服务器。

在您的 redis 存储中,您可以只将服务器的 ID 存储为客户端 ID 的值。然后 php 查找要使用的 Node 服务器并发出请求。

关于node.js - 从 Redis 检索 Socket.io 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11492661/

相关文章:

javascript - 如何在 promise 中履行 promise

lua - 将参数传递给 Redis Lua 脚本

java - 如何用spring在redis的缓存中创建文件夹?

socket.io - io.to()、io.in() 和 socket.to() 用于向房间中的所有客户端发射的区别

node.js - 可选 $match 管道运算符的 Mongodb 聚合追加方法

javascript - 如何将 Base64 编码的 URI 数据转换为文件*服务器端*?

docker - 容器不会连接到 redis 容器

azure - 如何修复 Azure VM 中套接字 io 服务器上的连接被拒绝?

node.js - Socket.IO 错误 'listen()' 方法在迁移到 Express 3.0 后需要一个 'http.Server' 实例

node.js - AWS Codedeploy 错误 : scripts/applicationstart. sh 不可执行。试图使其可执行