Приложение Channels перестает работать безо всякой причины перезапустить сервер unitil ASGI - PullRequest
0 голосов
/ 23 декабря 2018

В какой-то момент сервер приложений перестает работать.WS-клиенты пытаются подключиться, но не могут.В лог-файле есть трассировки, что клиент отключен до того, как соединение будет принято.Сервер останавливает даже простые запросы HTTP (без каких-либо трассировок в лог-файле).

У меня есть приложение каналов для работы с o7sock.js (https://github.com/Z-Wave-Me/O7) с одной стороны и REST Framework (DRF)с другой стороны. Все работает хорошо в течение некоторого времени. Я вижу ping / pong в лог-файле и отчеты от ws-клиентов. Я также могу делать вызовы REST против API.

В какой-то момент клиенты сразу отключаются. Похоже, что были сообщения ping / pong и следующий запрос ping заканчивается трассировкой, потому что клиент отключен. После этого остаются только запросы на подключение от ws-клиентов, которые отключаются до того, как соединение принято. Интерфейс HTTP / RESTв данный момент недоступно.

Единственный способ справиться с этим на данный момент - перезапустить серверную программу ASGI. Я пробовал daphne и uvicorn - у обоих есть эта проблема.

У моего приложения естьодин WebsocketConsumer (синхронный) для работы с WS-клиентами. У меня также есть несколько других SyncConsumers, которые работают в рабочемпроцессы.

Основная проблема заключается в том, что время сбоя не является регулярным, поэтому я не могу понять основную причину проблемы.Также похоже, что рабочие процессы не затронуты, потому что мне нужно перезапустить только сервер ASGI, чтобы приложение работало.

Я хочу иметь WS-сервер с долгоживущими клиентами.Сервер должен работать с моделями django и предоставлять REST API для внешних сервисов (мобильное приложение).Теперь у меня есть сервер, который работает в течение некоторого времени, но может выйти из строя в любое время без какой-либо причины.

Забыл упомянуть, что я использую почти последние версии библиотек и фреймворков, доступных через pip.

1 Ответ

0 голосов
/ 25 декабря 2018

Похоже, я справился сам.Для тех, кто может работать в этом выпуске: все дело в настройках по умолчанию.При использовании потребителей синхронизации у вас будет 5 потоков на процессор для одновременных запросов, независимо от того, будет ли это WS или HTTP.Как указано в документации https://channels.readthedocs.io/en/latest/topics/databases.html, вы можете увеличить этот предел с помощью переменной env ASGI_THREADS.Но, как правило, лучше использовать Async-потребитель для долгоживущих WS-клиентов.Сейчас у меня нет времени на рефакторинг, поэтому решение состоит в том, чтобы запустить несколько (по одному на процессор) дафновых серверов на общем FD с ASGI_THREADS = 100.Это дает 400 потоков с 4-мя дафни-процессами для синхронных задач.В любом случае, я собираюсь переписать моего потребителя WS, чтобы он был асинхронным в начале следующего года.При указанных выше настройках я не вижу проблем или предупреждений в своих журналах более суток.

...