Channels应用程序无故停止工作,并且ASGI服务器重新启动

时间:2018-12-23 19:06:49

标签: python-3.x websocket django-channels

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

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

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

目前处理该问题的唯一方法是重新启动ASGI服务器程序。 我尝试过达芙妮和uvicorn-都有这个问题。

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

主要问题是失败的时间不定期,所以我无法弄清楚问题的主要原因。看起来工作进程也没有受到影响,因为我只需要重启ASGI服务器即可使应用正常工作。

我想让WS服务器具有长期的客户端。服务器应与Django模型一起使用,并为外部服务(移动应用)提供REST API。现在,我有一台可以工作一段时间的服务器,但是它随时可能在没有任何原因的情况下发生故障。

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

1 个答案:

答案 0 :(得分:0)

好像我已经亲自处理过了。对于那些可以解决此问题的人: 这都是关于默认设置的。使用Sync使用者时,无论是WS还是HTTP,每个CPU都有5个线程用于同时请求。如文档https://channels.readthedocs.io/en/latest/topics/databases.html中所述,您可以使用环境变量ASGI_THREADS来突破此限制。但是通常,将Async消费者用于长期存在的WS-clients更好。现在我没有时间进行重构,因此解决方案是在ASID_THREADS = 100的共享FD上运行几台(每个CPU一台)daphne服务器。这为400个线程提供了4个daphne进程,用于同步任务。无论如何,我将在明年年初将我的WS使用者重写为异步的。 使用上述设置,超过一天我都不会在日志中看到任何问题或警告。