1

我想我正在寻找一个全是 python socketio 模块。然后当我开始使用带有 socketio 的消息代理时,使用 redis 的文档演示得很好。但是,我觉得奇怪的是 python-socketio 客户端没有显示如何连接到消息代理。这是意图并将其留给项目的追随者吗?

我不得不只依靠 python redis 来查看 python-socketio 如何连接到 redis,前提是它已经给出了带有地址的 db。此外,我发现 socket.io 是这一切的默认频道,并且发出的信息比我预期的要多。

预期:{'foo':'bar'}

观察到:{'method': 'emit', 'event': 'event', 'data': {'foo': 'bar'}, 'namespace': '/learning_it', 'room': None, 'skip_sid ':无,'回调':无,'host_id':''}

从模块使用的这一点来看,我们是否可以随心所欲地操作?

感谢粉丝的 Miguel Grinberg。

4

1 回答 1

9

您误解了消息队列的作用。

让我们暂时忘记排队。我们有一个或多个客户端,只有一台服务器。客户端通过长轮询或 websocket 连接到服务器。我想这一切都清楚了。

client1 ---+
           |
client2 ---+--- server
           |
client3 ---+

现在假设您想要扩展您的服务器,因为您有太多的客户端,太多以至于您的单个服务器无法处理它们。

解决方案是运行多个服务器,都在负载均衡器后面:

client1 ---+                     +--- server1
           |                     |
client2 ---+--- load balancer ---+
           |                     |
client3 ---+                     +--- server2

到目前为止,一切都很好?这个解决方案的问题是每个服务器只知道客户端的一个子集,因此无法向所有客户端广播事件。甚至不可能将事件发送到房间,因为该房间的参与者可能会被随机分配到不同的服务器。

那么我是如何解决这个问题的呢?我添加了一个消息队列,所有服务器都使用它来协调广播:

client1 ---+                     +--- server1 ---+
           |                     |               |
client2 ---+--- load balancer ---+               +--- pub/sub queue
           |                     |               |
client3 ---+                     +--- server2 ---+

使用这种设计,服务器可以通过将事件发送到它知道的客户端子集来发出广播,然后通过在队列上发布请求来要求其他服务器做同样的事情。

您在 Redis 服务器上看到的有效负载是内部的,旨在由属于集群的服务器使用。队列与客户没有直接联系。

希望这可以帮助!

于 2020-03-29T15:35:27.370 回答