Django 通道:写入套接字时出现未知错误。连接丢失

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

我们有 Django Channels 以及 uvicorn 和 azure redis 实例。我们的哨兵被诸如以下的错误所淹没:

Exception in ASGI application
 
ssd.consumers in disconnect

Error UNKNOWN while writing to socket. Connection lost.

异常在 asyncio/streams.py 文件中抛出,如示例所示 Snippet that throws exception.

我的主要问题是我不知道redis是否切断了这个连接,或者服务器不愿意保留它?任何提示表示赞赏。我还没有在本地 redis 实例上观察到这种行为。我们经营以下套餐:

Django = "~4.2"
redis = "^4.3.1"
channels = {extras = ["daphne"], version = "^4.0.0"}
channels-redis = "^4.1.0"
uvicorn = {extras = ["standard"], version = "^0.24.0.post1"}

值得指出的是,它在大多数情况下都有效,websocket 是可操作的,有时它只是随机抛出上面提到的异常。

django azure redis django-channels uvicorn
1个回答
0
投票

redis
使用
asyncio
包通过 Websocket 建立连接,并在客户端和服务器之间建立异步数据管道。服务器使用
asyncio
包中的不同函数来与客户端进行通信,并且大多数函数都可以正常工作。但是,如果您检查 PyPi 中的
channels-redis
,您会发现该库未通过测试并且不稳定。

但是,你应该能够让它稳定运行。确保您正在运行 Python 3.8+,如

redis
所示,如 PyPi 页面 所示。正如我所解释的,
channels-redis
在某些方面可能不稳定,但我认为这主要是不稳定的,因为找到完全兼容的正确系列的包并调用正确的函数名称,因为它们似乎在库中发生了变化。我建议使用具有良好库支持的新但不太旧的东西,现在我建议使用 Python 3.11.8。

当您使用 pip 安装/更新软件包时,您应该按照依赖项所需的顺序安装它们,并且它们应该安装与其他软件包兼容的软件包版本。您可能想要测试每个版本的稳定性并回滚

channels-redis
以查看是否有任何更改,检查 PyPi 上的
redis
版本和发布日期。

当您安装最新的 Django for Python 3.11.8 时,您应该安装

redis
channels-redis
,并且很可能一切都会正常工作。但如果您在生产环境中,可能值得注意您当前的软件包版本或完全使用测试服务器。

pip install Django --upgrade
pip install redis --upgrade
pip install channels-redis --upgrade
© www.soinside.com 2019 - 2024. All rights reserved.