我想我正在寻找一个全是python的socketio模块。然后,当我开始在socketio中使用message broker时,文档使用redis进行了很好的演示。然而,我发现奇怪的是,python-socketio客户机没有显示如何连接到消息代理。这就是你的意图,并把它留给项目的追随者吗?
我只能依靠python redis来查看python-socketio是如何连接到redis的,前提是给出了带有地址的db。此外,我发现socket.io是所有内容的默认通道,它发出的信息比我预期的要多。
期望:{'foo':'bar'}
观察:{'method':'emit','event':'event','data':{'foo':'bar'},'namespace':'/learning_it','room':无,'skip_sid':无,'callback':无,'host_id':''}
从模块使用的角度来看,我们是否可以随心所欲地操作?
谢谢米格尔·格林伯格,来自粉丝。
发布于 2020-03-29 23:35:27
您误解了消息队列的角色。
让我们暂时忘掉队列。我们有一个或多个客户端,但只有一个服务器。客户端通过长轮询或websocket连接到服务器。我想这一切都很清楚了。
client1 ---+
|
client2 ---+--- server
|
client3 ---+现在假设你想扩展你的服务器,因为你有太多的客户端,太多了,以至于你的单个服务器不能处理所有的客户端。
解决方案是运行多个服务器,所有服务器都在负载均衡器后面:
client1 ---+ +--- server1
| |
client2 ---+--- load balancer ---+
| |
client3 ---+ +--- server2到目前一切尚好?这种解决方案的问题是,每个服务器只知道客户端的一个子集,因此无法向所有客户端广播事件。甚至不可能将事件发送到房间,因为该房间的参与者可能会被随机分配到不同的服务器。
那么我是如何解决这个问题的呢?我添加了一个消息队列,所有服务器都使用它来协调广播:
client1 ---+ +--- server1 ---+
| | |
client2 ---+--- load balancer ---+ +--- pub/sub queue
| | |
client3 ---+ +--- server2 ---+使用这种设计,服务器可以通过将事件发送到它所知道的客户机子集来发布广播,然后通过在队列上发布请求来请求其他服务器执行相同的操作。
您在Redis服务器上看到的有效负载是内部负载,应该由作为集群一部分的服务器使用。该队列与客户端没有直接联系。
希望这能有所帮助!
https://stackoverflow.com/questions/60909094
复制相似问题