多路复用 websocket 连接是 Django Channels >= 2 中的重要优化吗?

Is multiplexing websocket connections an important optimization in Django Channels >= 2?

我维护了一个 Django Channels v1 应用程序,其中有六个消费者通过一个 WebSocket 连接进行多路复用。我正在升级到 Django Channels v2,不再支持连接(去)多路复用;参见 GitHub Issue #825 - (Re)Implement Multiplexing. If I want to multiplex, I can use channels-demultiplexer, channelsmultiplexer,或自己编写。我倾向于重新实现多路复用,因为我认为这需要对我们现有的代码进行更少的更改。

在此之前,我正在做一些尽职调查,以确定多路复用是否是一个重要的优化。

在 Nginx 和 Daphne(目前主要计划 SyncConsumers)和 Gunicorn 后面的负载平衡环境中,考虑到 Redis 支持的 Django 2 + Channels 2 应用程序,我认为将 websocket 连接数增加 3-5 倍只会微不足道地增加 Redis RAM、应用程序服务器 RAM 和 Daphne CPU,也会微不足道地增加浏览器 RAM 和 CPU,但这只是一个有根据的猜测。

  1. 我应该如何考虑每个额外的 WebSocket 连接的成本 a.) 在 Django Channels v2 中和 b.) 在浏览器中?
  2. 我还没有看到任何设计用于在单个页面上使用多个 WebSocket 连接的 Web 应用程序。你?如果是这样,它是否高效?它使用了多少个连接?
  3. 你会怎么做?

解决相邻但不同问题的 Stack Overflow 帖子:

作为 channelsmultiplexer 的作者,我希望我有一些有用的见解。

Channelv2 有一件重要的事情要记住,每个消费者实例都有 1 个 运行-roop,因此在处理一条消息时将无法处理另一条消息(它们会排队)。特别是如果您对消费者执行的操作需要时间(db 或其他),消费者在工作时将不会收到其他消息。使用 channelsmultiplexer 时,阻塞不会影响其他多路消费者实例。如果有 changes/additions 你需要 channelsmultiplexer 随时在回购上创建问题我很乐意根据需要进行更改以适应更多人的用例。

How should I think about the cost of each additional websocket connection a.) in Django Channels v2 and b.) in the browser?

是的,因为除非你通过 HTTP2 隧道 ws(不支持通道,但如果你确定所有客户端都是 http2,nginx 可以帮助你一年)用户浏览器可能会限制并发 HTTP 连接的数量你可以打开。许多浏览器会将您限制为大约 7 个打开的连接,但这可能会随时更改,并且移动浏览器可能会更严格(它们往往是)