gpt4 book ai didi

django - 如何将 Web 套接字与 django wsgi 集成

转载 作者:行者123 更新时间:2023-12-04 08:52:42 25 4
gpt4 key购买 nike

我们有一个非常复杂的 Django 应用程序,目前由
apache/mod_wsgi 并部署在多个 AWS EC2 实例后面
AWS ELB 负载均衡器。客户端应用程序与服务器交互
使用 AJAX。他们还定期轮询服务器以检索通知
并更新他们的状态。我们希望删除轮询并替换
它使用“推送”,使用网络套接字。

因为任意实例处理来自客户端的 Web 套接字请求
并保持这些网络套接字,因为我们希望将数据推送到
可能不在提供源的同一实例上的客户端
用于推送的数据,我们需要一种方法将数据路由到适当的
实例,然后从该实例到适当的客户端 Web
socket 。

我们意识到 apache/mod_wsgi 不能很好地与 web sockets 配合使用,并且
计划用 nginx/gunicorn 替换这些组件并使用
gevent-websocket worker 。但是,如果多个工作进程之一
接收来自客户端的请求以建立 Web 套接字,如果
工作进程的生命周期由主要 gunicorn 控制
进程,不清楚其他工作人员是如何处理的,或者实际上
非 gunicorn 进程可以向这些 Web 套接字发送数据。

一个特定的案例是这样的:发出 HTTP 请求的用户是
定向到一个 EC2 实例(主机)并且所需的行为是数据是
发送给另一个完全打开网络套接字的用户
不同的实例。人们可以很容易地设想一个系统,其中一条消息
可以向每个实例上运行的代理(例如 rabbitmq)发送消息
包含要通过网络套接字发送到连接的客户端的数据
到那个实例。但是这些消息的处理程序如何访问
在 gunicorn 的工作进程中收到的网络套接字?
高级 python web 套接字对象创建了 gevent-websocket 和
提供给 worker 的不能被腌制(它们是实例
不支持酸洗的方法),因此它们不能轻易共享
从一个工作进程到一些长期运行的外部进程。

其实这个问题的根源归结为web sockets如何
由来自客户端的 HTTP 请求发起并由 WSGI 处理
服务器中的处理程序(例如 gunicorn)可由外部访问
流程? gunicorn worker 处理似乎不对,
用于处理 HTTP 请求的将产生长时间运行
线程卡在网络套接字上并支持处理来自
其他进程将消息发送到已被调用的 Web 套接字
通过这些工作进程附加。

谁能解释一下网络套接字和基于 WSGI 的 HTTP 请求
处理程序可能会在我描述的环境中相互作用吗?

谢谢。

最佳答案

我认为您已经做出正确的评估,即 mod_wsgi + websockets 是一个令人讨厌的组合。

您会发现所有 wsgi 工作人员都被 Web 套接字占用,并且尝试(大量)增加工作人员池的大小可能会因为内存使用和上下文切换而阻塞服务器。

如果您想坚持使用同步 wsgi 工作架构(而不是由 gevent、twisted、tornado 等实现的响应式(Reactive)方法),我建议将 uWSGI 视为应用程序服务器。最近的版本可以以旧方式处理一些 URL(即您现有的 django View 仍然可以像以前一样工作),并将其他 url 路由到异步 websocket 处理程序。这对您来说可能是一条相对顺利的迁移路径。

关于django - 如何将 Web 套接字与 django wsgi 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com