我想我正在寻找一个全是 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。
你误解了消息队列的作用。
让我们暂时忘记队列。我们有一个或多个客户端和一个服务器。客户端通过长轮询或 websocket 连接到服务器。我想这已经很清楚了。
client1 ---+
|
client2 ---+--- server
|
client3 ---+
Run Code Online (Sandbox Code Playgroud)
现在假设您想要扩展您的服务器,因为您有太多的客户端,以至于您的单个服务器无法处理所有这些客户端。
解决方案是运行多个服务器,所有服务器都在负载平衡器后面:
client1 ---+ +--- server1
| |
client2 ---+--- load balancer ---+
| |
client3 ---+ +--- server2
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好?这个解决方案的问题是每个服务器只知道客户端的一个子集,所以没有办法向所有客户端广播一个事件。甚至不可能将事件发送到房间,因为该房间的参与者很可能会被随机分配到不同的服务器。
那么我是如何解决这个问题的呢?我添加了一个消息队列,所有服务器都使用它来协调广播:
client1 ---+ +--- server1 ---+
| | |
client2 ---+--- load balancer ---+ +--- pub/sub queue
| | |
client3 ---+ +--- server2 ---+
Run Code Online (Sandbox Code Playgroud)
通过这种设计,服务器可以通过将事件发送到它知道的客户端子集来发出广播,然后通过在队列上发布请求来要求其他服务器也这样做。
您在 Redis 服务器上看到的负载是内部的,旨在供集群中的服务器使用。队列与客户没有直接联系。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |