当将Socket.io/Node.js和Redis pub/sub连接起来,试图创建一个能够处理多种传输方式的基于服务器事件驱动的实时Web广播系统时,有三种方法:
然而,在我的测试中,所有方法与超过1个连接的客户端表现出意外的低性能。所涉及的服务器事件是尽可能快地发布了1000条消息到Redis频道,并尽可能快地分发这些消息。性能通过连接的客户端(基于socket.io-client),记录时间戳到Redis列表进行分析来测量。我推测的情况是,在选项1中,服务器收到消息后,顺序写入所有连接的客户端。在选项2中,服务器会多次收到每个消息(每个客户端订阅一次),然后将其写入相关的客户端。在任何一种情况下,服务器在把消息传递给所有连接的客户端之前不会进入第二个消息事件。这种情况随着并发性的增加而变得更加明显。
这似乎与该技术栈的能力认知相矛盾。我想相信,但我很困惑。
这种情况(低延迟分发大量消息)是否还不支持这些工具(尚未实现),或者我是错过了什么技巧?
- 创建redis连接并订阅频道。在socket.io客户端连接时,将客户端加入到socket.io房间中。在redis.on("message",...)事件中,调用io.sockets.in(room).emit("event",data) 将消息分发给相关房间中的所有客户端。如:如何重用socket.io中的redis连接?
- 创建redis连接。在socket.io客户端连接时,将客户端加入到socket.io房间并订阅相关的redis频道。在客户端连接闭包(closure)内部包含redis.on("message",...),当接收到消息时,调用client.emit("event",data)在特定客户端上触发事件。如:使用RedisStore在socket.io中的示例
- 使用内置在socket.io中的RedisStore,并从Redis中的单个“dispatch”频道进行“广播”,遵循socketio-spec协议。
然而,在我的测试中,所有方法与超过1个连接的客户端表现出意外的低性能。所涉及的服务器事件是尽可能快地发布了1000条消息到Redis频道,并尽可能快地分发这些消息。性能通过连接的客户端(基于socket.io-client),记录时间戳到Redis列表进行分析来测量。我推测的情况是,在选项1中,服务器收到消息后,顺序写入所有连接的客户端。在选项2中,服务器会多次收到每个消息(每个客户端订阅一次),然后将其写入相关的客户端。在任何一种情况下,服务器在把消息传递给所有连接的客户端之前不会进入第二个消息事件。这种情况随着并发性的增加而变得更加明显。
这似乎与该技术栈的能力认知相矛盾。我想相信,但我很困惑。
这种情况(低延迟分发大量消息)是否还不支持这些工具(尚未实现),或者我是错过了什么技巧?