Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从Redis检索Socket.io客户端_Node.js_Redis_Socket.io_Scale - Fatal编程技术网

Node.js 从Redis检索Socket.io客户端

Node.js 从Redis检索Socket.io客户端,node.js,redis,socket.io,scale,Node.js,Redis,Socket.io,Scale,我正在构建一个实时数据系统,它允许Apache/PHP服务器将数据发送到Node.js服务器,然后Node.js服务器将立即通过socket.io将数据发送到关联的客户端。因此Apache/PHP服务器发出一个包含数据的请求,以及一个告诉Node.js将数据发送到哪个用户的用户令牌 现在这一切都很好——我有一个关联数组,它将用户的socket.io连接绑定到他们的用户令牌。问题是我需要开始将其扩展到多个服务器。当然,使用默认的socket.io配置,我无法在节点工作程序之间共享连接 我想到的解决

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

现在这一切都很好——我有一个关联数组,它将用户的socket.io连接绑定到他们的用户令牌。问题是我需要开始将其扩展到多个服务器。当然,使用默认的socket.io配置,我无法在节点工作程序之间共享连接

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

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


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

一旦与运行节点服务器的服务器建立了socket连接,它就会连接到该实例

因此,您似乎需要为php服务器提供一种方法,让它知道客户端连接到哪个节点服务器


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

我不认为添加更多服务器会改变什么。一旦在浏览器和nodejs实例之间建立了socket.io连接,它将在该连接的生命周期内保持在同一台服务器上。为什么集群中的其他服务器需要知道这个特定的连接?这就是Redistore背后的想法。Redis将允许所有服务器了解所有存储的客户机并与之通信。它提供了一个类似express的界面,用于在redid和socket.io的基础上构建实时分布式应用程序。它解决了管理socket.io客户端的问题。您说过,
我有一个关联数组,可以将用户的socket.io连接绑定到他们的用户令牌上
-您是如何做到的?服务器如何知道此特定套接字(socket.id=12387)表示此特定令牌(token=198237189237)?