如何处理高传入数据并将受限制的数据发送到 django-channels 中的 Web 套接字

Posted

技术标签:

【中文标题】如何处理高传入数据并将受限制的数据发送到 django-channels 中的 Web 套接字【英文标题】:how handle high incoming data and sending throttled data to web sockets in django-channels 【发布时间】:2019-01-12 06:46:44 【问题描述】:

我的 django Web 服务器出现问题。

我们正在使用 python3、django2、django-rest-framework3.8 和 channels2.x

场景是我们正在以非常快的速率(大约每秒 100 条消息)从 UDP 连接接收数据。恢复的数据是 proto 格式的(你可以说我们正在接收字节数据)。在此过程中,由于 生产速率 >>> 消耗速率,我们正在实施节流,但仍有 100 个并发用户数据再次匮乏。任何人都可以在这种情况下帮助我们。

如果有人有任何新的架构想法,请分享。

这无疑是一个有趣的问题。这是关于股市信息的

PS :- 我不能发布任何代码,因为它是我的公司。但我可以在您需要澄清任何一点的任何时候提供帮助。

【问题讨论】:

这取决于你所说的消费是什么意思。如果您的意思是读取请求并解析它,那么如果需要时间,您可以将处理部分委托给工作进程。您还应该确保大多数通道方法是异步的,以避免将其绑定到 IO 绑定操作。如果您需要在 asyn 方法中访问数据库,也可以使用 database_sync_to_async 装饰器。完成所有这些工作后,您的通道设置应该只是完成获取 websocket 数据的工作,而处理由其他工作人员(如 celery 或其他设置)完成。 【参考方案1】:

在许多股票市场数据应用程序中,通过让 Lightstreamer Server 处理 websocket 上的节流来解决同样的问题(完全披露:我是 Lightstreamer 的 CEO)。

您将使用 Lightstreamer API 开发一个数据适配器,以使用来自您的 UDP 连接的数据并将它们注入 Lightstreamer 服务器。然后,您可以为每个客户端和每个订阅指定最大更新速率,以及最大带宽。 Lightstreamer 将动态限制数据,不仅考虑客户端容量,还考虑网络状态。

限制时,您可以在合并更新(股市数据的典型情况)和排队之间进行选择。

【讨论】:

以上是关于如何处理高传入数据并将受限制的数据发送到 django-channels 中的 Web 套接字的主要内容,如果未能解决你的问题,请参考以下文章

Swoole如何处理高并发

一文教你如何处理高并发

Swoole 如何处理高并发以及异步 I/O 的实现

用一个示例讲解我是如何处理高并发的

.net如何处理高并发socket,建立高性能健壮的socket服务

如何处理高并发?