Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Redis客户端广播问题(在Socket.IO上下文中)_Redis_Socket.io_Scalability_Publish Subscribe_Disconnect - Fatal编程技术网

Redis客户端广播问题(在Socket.IO上下文中)

Redis客户端广播问题(在Socket.IO上下文中),redis,socket.io,scalability,publish-subscribe,disconnect,Redis,Socket.io,Scalability,Publish Subscribe,Disconnect,所以我读了一些关于scaling Socket.IO的文章。出于各种原因,我不想使用内置的Socket.IO缩放机制(大多数情况下,它似乎效率低下,因为它向Redis发布了很多我认为需要的东西) 所以我想到了一个简单的想法: 每个Socket.IO服务器创建Redis发布/订阅/存储客户端,连接到Redis并订阅一个频道。现在,当我想要广播数据时,我只需将其发布到Redis和所有其他Socket.IO服务器,然后将其发送给用户 不过有一个问题(我认为Socket.IO内置机制也有问题)。假设我想

所以我读了一些关于scaling Socket.IO的文章。出于各种原因,我不想使用内置的Socket.IO缩放机制(大多数情况下,它似乎效率低下,因为它向Redis发布了很多我认为需要的东西)

所以我想到了一个简单的想法:

每个Socket.IO服务器创建Redis发布/订阅/存储客户端,连接到Redis并订阅一个频道。现在,当我想要广播数据时,我只需将其发布到Redis和所有其他Socket.IO服务器,然后将其发送给用户

不过有一个问题(我认为Socket.IO内置机制也有问题)。假设我想知道所有连接用户的数量。至少有两种方法可以做到这一点:

  • 服务器A向Redis发布
    give\u me\u clients
    。然后,每个Socket.IO服务器统计连接数并发布
    客户端数
    。服务器A获取该数据,将其合并并发送到客户端

  • 每当用户连接/断开与服务器的连接时,每台服务器都会更新Redis中::ID_的
    客户端数量。然后服务器A只是获取数据并将其合并。可能更有效

  • 不过,这些解决方案存在一些问题:

  • 服务器A不知道其他服务器。因此,他不知道什么时候应该停止收听客户的数量。我们可以通过让服务器A了解其他服务器来解决这个问题:每当服务器连接到Redis时,他就会发布
    new_Server
    (服务器A获取数据并将其存储在内存中)。但当Redis-Socket.IO连接中断时,该怎么办?Redis是否有办法通知客户端其中一个客户端已断开连接

  • 其实和上面一样。当Socket.IO服务器崩溃时,如何清除
    客户端的数量
    数据


  • 所以真正的问题是:Redis是否可以通知(发布到香奈儿)客户,与其中一个客户的连接刚刚结束???

    经过大量测试,Redis似乎没有这样的功能。我还发现,缩放Socket.IO确实很痛苦

    因此,我已从Socket.IO切换到WS(请参阅)。它的级别很低(但非常适合我使用),并且只支持WebSocket(在所有主要版本中)。但是我只想支持WebSockets和FlashSocket(我必须手动安装,但这很好)

    其优点是,我可以轻松地使用此类服务器创建集群。HAProxy几乎可以在开箱即用的情况下使用这些服务器(一些小的调整)。服务器可以在本地网络上轻松通信(如果集群很大,则使用UDP或中央TCP服务器)


    缺点是必须手动实现一些很酷的功能,如心跳、广播、房间等。您也希望有很长的轮询回退时间,但在我的情况下,这很好。缩放更为重要,imho。

    我也切换到了ws,我基本上运行了一个进程。在退出时,通过
    wss.clients
    循环,并删除redis存储中的所有
    user:id
    (如果服务器出现故障)。我遇到的一个简单问题是私人消息。如果我在端口9300和9301上有两个ws-server,并且来自9301的用户希望向9300中的用户发送消息(或者可能是任何其他服务器/端口),我不确定如何让其他用户知道。我是否只需将私有消息请求发布到redis服务器,并找出该用户所在的wss服务器向他们发送消息?@NiCkNewman我认为,对于每个用户,您应该保留该用户所在服务器的信息(在redis这样的共享位置)。然后,您只需检索该信息并直接向目标服务器发送消息。但最有效的方法是用户知道他的朋友在哪台服务器上,并将消息直接发送到该服务器。当然,所有这些都取决于上下文。例如,您可能希望保留聊天历史记录(如Facebook),然后这一切变得更加复杂。我对聊天服务器没有太多经验,所以我不想把你引向错误的方向(嗯,我明白了。因此,对于每个ws-server(实例),保留所有已连接客户端的跟踪/列表?或者您的意思是将端口号和服务器信息存储为每个redis用户值的属性?或者两者都存储?:)@NiCkNewman我确信两者都会很方便。:)但我想把服务器信息作为每个Redis用户的财产。这样可以最快找到所需的服务器。