频道应用程序无故停止工作直到 ASGI 服务器重启

Channels app stops working without any reason unitil ASGI server restart

在某个时间点,应用程序服务器停止工作。 WS 客户端正在尝试连接,但无法连接。日志文件中有回溯,客户端在接受连接之前已断开连接。服务器甚至停止提供纯 HTTP 请求(日志文件中没有任何回溯)。

我有一个频道应用程序,一方面可以使用 o7sock.js(https://github.com/Z-Wave-Me/O7),另一方面可以使用 REST Framework(DRF)。一段时间内一切正常。我在日志文件和来自 ws-clients 的报告中看到 ping/pong。我还可以对 API.

进行 REST 调用

有时客户端会立即断开连接。看起来有 ping/pong 条消息,下一个 ping 请求以回溯结束,因为客户端已断开连接。在那之后,只有来自 ws-clients 的连接请求,在接受连接之前断开连接。 HTTP/REST 界面目前不可用。

此时唯一的处理方法就是重启ASGI服务器程序。 我试过 daphne 和 uvicorn - 都有这个问题。

我的应用程序有一个 WebsocketConsumer(同步)来处理 WS 客户端。我还有一些其他 SyncConsumers,它们正在工作进程中工作。

主要问题是失败的时间不规律,所以我无法找出问题的主要原因。看起来工作进程也没有受到影响,因为我只需要重新启动 ASGI 服务器就可以使应用程序正常工作。

我想要 WS 服务器和长寿命客户端。服务器应使用 django 模型并为外部服务(移动应用程序)提供 REST API。现在我有一台可以工作一段时间的服务器,但随时可能无缘无故地失败。

忘了说,我使用几乎最新版本的库和框架,可通过 pip 获得。

看来是我自己搞定的。对于那些可以 运行 在这个问题上的人: 这都是关于默认设置的。使用 Sync 消费者,每个 CPU 有 5 个线程用于同时请求,无论是 WS 还是 HTTP。正如文档 https://channels.readthedocs.io/en/latest/topics/databases.html 中所述,您可以使用环境变量 ASGI_THREADS 来突破此限制。但一般来说,对于长期存在的 WS 客户端,最好使用异步消费者。现在我没有时间进行重构,所以解决方案是 运行 几个(每个 CPU 个)daphne 服务器在共享 FD 上 ASGI_THREADS=100。这为同步任务提供了 400 个线程和 4 个 daphne 进程。不管怎样,我打算在明年初重写我的 WS 消费者,使其成为异步的。 使用上述设置,我在一天多的时间里都没有在我的日志中看到任何问题或警告。