Каналы Django: НЕИЗВЕСТНАЯ ошибка при записи в сокет. Соединение потеряно

У нас есть каналы Django в сочетании с экземпляром uvicorn и Azure Redis. Наш часовой завален такими ошибками, как:

Exception in ASGI application
 
ssd.consumers in disconnect

Error UNKNOWN while writing to socket. Connection lost.

Исключение создается в файле asyncio/streams.py, как показано в примере.

Моя главная проблема заключается в том, что я понятия не имею, прерывает ли 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"}

Стоит отметить, что в большинстве случаев это работает, веб-сокеты работают, иногда просто случайно выдается упомянутое выше исключение.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

redis использует пакет asyncio для установки соединения через веб-сокет и асинхронного конвейера данных между клиентом и сервером. Сервер использует различные функции пакета asyncio для связи с клиентом, и большинство из них работают нормально. Однако, если вы проверите PyPi на наличие channels-redis, вы увидите, что эта библиотека не проходит тесты и нестабильна.

Тем не менее, вы должны быть в состоянии заставить его работать стабильно. Убедитесь, что вы используете Python 3.8+, как это требуется для redis, как показано на странице PyPi. Как я объяснил, channels-redis может быть в некотором отношении нестабильным, но я думаю, что в основном он нестабильен при поиске правильной серии пакетов, которые полностью совместимы и вызывают правильные имена функций, поскольку они меняются в библиотеках. Я рекомендую использовать что-то новое, но не слишком старое, с хорошей поддержкой библиотек. Сейчас я предлагаю Python 3.11.8.

Когда вы устанавливаете/обновляете пакеты с помощью pip, вы должны устанавливать их в том порядке, в котором этого требуют зависимости, и они должны устанавливать версию пакета, совместимую с другими пакетами. Здесь вы можете проверить стабильность каждой версии и выполнить откат channels-redis, чтобы увидеть, изменилось ли что-нибудь, сверившись redis с версией и датой выпуска на PyPi.

Когда вы устанавливаете последнюю версию Django для Python 3.11.8, вам следует установить redis и channels-redis, и, скорее всего, все будет работать. Но, возможно, стоит принять во внимание текущие версии вашего пакета или вообще использовать тестовый сервер, если вы работаете в рабочей среде.

pip install Django --upgrade
pip install redis --upgrade
pip install channels-redis --upgrade

Привет! Я вернулся с отзывами, поэтому я попробовал каждую версию channels-redis и redis в различных конфигурациях, ни одна из них не помогла. В настоящее время я исправил версии ``` redis = "^5.0.0" Channels-redis = "^4.2.0" Channels = { extras = ["daphne"], version = "^4.0.0" } Django = "~ 4.2" ``` и продолжаю отлаживать экземпляр Redis, отличный от экземпляра, арендованного у Azure.

Mateusz Pydych 06.06.2024 13:06

Что ж, похоже, проблема в кеше Azure для Redis: после того, как я развернул Redis в кластере и установил соединение, он перестал выдавать исключения. Поскольку мне приходится использовать кэш Azure для Redis, я буду отлаживать его дальше. Redis я развернул: artehub.io/packages/helm/bitnami/redis

Mateusz Pydych 06.06.2024 15:06
Ответ принят как подходящий

По-видимому, в channels_redis lib можно указать дополнительные настройки, которые явно не указаны в документации. Поскольку Azure Cache For Redis не является либеральным, он отключал время простоя соединений. Изменение моей настройки на эту решенную проблему:

    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels_redis.core.RedisChannelLayer",
            "CONFIG": {
                "hosts": [
                    { # specifying host as dict with additional keys for redis-py client was a key to solve it.
                        "address": CHANNELS_REDIS_URL,
                        "retry_on_timeout": True,
                        "health_check_interval": 1,
                        "socket_keepalive": True,
                    }
                ],
                "capacity": 1500,
                "expiry": 5,
            },
        },
    }

Другие вопросы по теме

Как удалить виртуальную машину Azure и связанные с ней ресурсы, такие как (ip, nsg, nic, disk), с помощью вызовов REST API?
Не удалось создать конвейер в Azure DevOps с помощью rest API — значение не может быть нулевым. Имя параметра: имя_репозитория
Могу ли я использовать Azure Data Explorer (Kusto) для запроса данных (например, групп) в Microsoft Entra Admin Center?
В React CRA внешние автономные сценарии Azure Map (azure-maps-geolocation-control.js) не могут читать пространство имен Azure Map SDK
Обеспечение рабочего процесса и подключения API для стандартного приложения логики с помощью шаблонов/скриптов Bicep
Столбцы с нулевым выходом в разделе Sink Error Solution
Почему версия NodeJS на Kudu отличается от версии моего приложения?
Общедоступный IP-адрес Azure Load Balancer с сертификатом CloudFlate
Как подключиться от pgadmin к серверу PostgreSQL с частной конечной точкой в ​​Azure?
Как изменить заголовок запроса на включение, который уже добавлен в репозитории Azure?