当前位置: 首页 > 面试题库 >

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

邹华皓
2023-03-14
问题内容

因此,我读了一些有关扩展Socket.IO的文章。由于种种原因,我不想使用内置的Socket.IO缩放机制(大多数情况似乎效率低下,因为从我的角度来看,它向Redis发布了很多东西)。

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

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

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

  1. 服务器A发布give_me_clients到Redis。然后,每个Socket.IO服务器都会计算连接数并发布number_of_clients。服务器A抓取该数据,将其组合并发送给客户端。

  2. number_of_clients_for::ID_HERE每当用户连接到服务器或从服务器断开连接时,每个服务器都会在Redis中更新。然后,服务器A仅获取数据并将其合并。可能会更有效率。

这些解决方案仍然存在问题:

  1. 服务器A不知道其他服务器。因此他不知道什么时候该停止听number_of_clients。可以通过使服务器A知道其他服务器来解决此问题:每当服务器连接到Redis时,他都会发布new_server(服务器A抓取数据并将其存储在内存中)。但是,当Redis-Socket.IO连接断开时该怎么办?Redis是否可以通知客户端其中一个客户端已断开连接?

  2. 其实和上面一样。当Socket.IO服务器崩溃时,如何清除number_of_clients数据?

因此,真正的问题是:Redis可以通知(发布到chanel)客户端与其中一个客户端的连接刚刚结束吗?


问题答案:

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

因此,我已经从Socket.IO切换到WS(请参阅此链接)。它是低级的(但是很适合我使用),并且仅支持WebSockets(在所有主要版本中)。但是话又说回来,我只想支持WebSockets和FlashSocket(我必须手动对其进行实现,但这很好)。

优点是我可以轻松地使用此类服务​​器创建集群。HAProxy几乎可以立即使用此类服务​​器(有些小的调整)。服务器可以轻松地在本地网络上进行通信(如果群集很大,则可以使用UDP或中央TCP服务器)。

缺点是必须手动实现一些很酷的功能,例如心跳,广播,房间等。另外,您还希望进行长轮询回退,但这对我来说很好。缩放更重要,恕我直言。



 类似资料:
  • 在文档的socket.io客户端套接字部分http://socket.io/docs/client-api/#io#socket指的是套接字文档,这意味着服务器套接字对象和客户端套接字对象是相同的。

  • 问题内容: 我正在使用node.js + socket.io构建一个像实时新闻源这样的简单系统。 由于这是一个“只读”系统,因此客户端可以连接和接收数据,但是客户端实际上从不发送自己的任何数据。服务器生成需要发送给所有客户端的消息,没有客户端生成任何消息;但我确实需要广播。 socket.io广播的文档(页面末尾)说 要广播,只需向和方法调用添加标记。广播意味着将消息发送到其他人(除了启动该消息的

  • 问题内容: 我正在尝试让socket.io(节点库)正常工作。 我有服务器端的js,并且正在监听。socket.io网站仅声明: 很好,但是,我要导入什么JS文件! 我进入了node_modules目录,通过npm安装了socket.io,里面是 文件。但是,这是服务器端的(使用短语,它在客户端上出错)。 我已经花了一个小时环顾四周,但无法使任何客户端.js文件正常工作。 我想念什么? 问题答案:

  • 问题内容: 是否有适用于Java的Socket.IO客户端?到目前为止,我只找到了仅适用于JavaScript的官方Socket.IO客户端和仅作为服务器的socket.io- java。 问题答案: 目前的选项有限: http://code.google.com/p/weberknecht/ https://github.com/TooTallNate/Java-WebSocket https:

  • Socket.IO 的开源 iOS 客户端,使用 swift 编写。 演示视频:http://fat.gfycat.com/EssentialBlueElectriceel.webm 使用示例: import Foundationlet socket = SocketIOClient(socketURL: "localhost:8880")socket.on("important message"

  • 问题内容: 我正在构建一个实时Web应用程序。 我希望能够从python应用程序的服务器端实现发送广播消息。 这是设置: 客户端上的 socketio.js TornadIO2 服务器作为Socket.IO服务器 *服务器端的 *python ( Django 框架) 我可以成功地将socket.io消息从客户端发送到服务器。服务器处理这些并可以发送响应。在下文中,我将描述我是如何做到的。 当前设