渠道应用程序停止工作,没有任何理由单元ASGI服务器重新启动

问题描述 投票:0回答:1

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

我有一个渠道应用程序与o7sock.js(https://github.com/Z-Wave-Me/O7)和另一方面REST框架(DRF)一起使用。一切都运行良好一段时间。我在日志文件中看到ping / pong,并从ws-clients看到报告。我也可以针对API进行REST调用。

在某些时候,客户端会立即断开连接。看起来有ping / pong消息,下一个ping请求以traceback结束,因为客户端已断开连接。在此之后,只有来自ws-clients的连接请求在连接被接受之前断开连接。 HTTP / REST接口目前不可用。

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

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

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

我希望拥有长期生活客户端的WS服务器。服务器应该与django模型一起使用,并为外部服务(移动应用程序)提供REST API。现在我有一台服务器工作了一段时间,但可以随时失败,没有任何理由。

忘了提一下,我使用几乎最后版本的库和框架,可以通过pip获得。

python-3.x websocket django-channels
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.