WebSocket (сервер Python, клиент javascript/rxjs) отсутствуют сообщенияPython

Программы на Python
Ответить
Anonymous
 WebSocket (сервер Python, клиент javascript/rxjs) отсутствуют сообщения

Сообщение Anonymous »

Введение
Я стараюсь предоставить как можно больше информации заранее, поэтому, если я что-то пропустил, дайте мне знать. Противники/закрыватели: пожалуйста, объясните мне, чтобы я мог решить вопрос.
Обновить
Я изменил свой код, чтобы использовать потребителя WebSocket непосредственно в Django. каналы вместо канального уровня, и это решило проблему. Я переключился с «уровня канала в памяти» на «уровень канала Redis» и теперь получаю это сообщение:

Код: Выделить всё

2024-11-24 12:08:24,922 INFO     1 of 1 channels over capacity in group 6425f8a5-81cd-4670-85c4-a30aad69cd53`.
Да, я знаю, что «в памяти» не рекомендуется для производства, но это не производство, но теперь я вижу ошибку, которой раньше не видел, и ограничения не были Это не очень понятно.
Я, наверное, удалю этот вопрос, если только кто-то не считает, что мне следует его оставить. Я обнаружил это, попытавшись выйти за пределы отправки, и понял, что просматриваю уровень каналов.
Обновление 2
Я обнаружил это в спецификации уровня канала каналов Django:
«Отправка в группу никогда не вызывает ChannelFull; вместо этого оно должно молча отбросить сообщение, если оно превышает пропускную способность, в соответствии с политикой доставки ASGI «не более одного раза». Это симптом, который я наблюдаю, и он все объясняет. Очевидно, я делаю что-то не так и вернусь к этому еще раз.
Мотивация
сервер выполняет работу (asyncio с многопроцессорной обработкой), клиент просто запрашивает и представляет данные. WebSockets (в данном случае WS) используются в первую очередь для минимизации задержки запросов и ответов (протоколы подключения выполняются заранее, а соединение TLS выполняется один раз). WS использует TCP, который обеспечивает достаточно прозрачные транзакции... нет необходимости в UDP или чем-то еще для большей скорости.
Настройка
  • WS-сервер: каналы Python/Daphne/Django (обновлено)
  • WS-клиент: Javascript/Angular/Rxjs (обновлено)
  • Оба работают на локальном хосте (нет физической пропускной способности) разногласия, )
Приложения
  • Клиент: Angular, в первую очередь запрашивает и форматирует данные для представления.
  • Сервер 1: Django передает асинхронный потребитель JSON (asyncio framework... возможно, это будет важно позже).
  • Сервер 2: Python с использованием пакета WebSockets pypi asyncio (в настоящее время наследие...рассмотрим позже...подтверждено, что проблема не в этом).
Экземпляр сервера 1 подключается к соединению TLS WS сервера 2.
Проблема
Я внедрил серверы несколько лет назад. Короче говоря: при использовании await с Django ORM я заметил некоторые аспекты задержки в местах, которых не ожидал. Короткий ответ? Я только что переключил соединения с БД с data_sync_to_async на перенос вызовов в asyncio.to_thread. Без сомнения, уровень параллелизма улучшился в 10 раз, поскольку я выполнял множество вызовов БД в начале и в конце транзакции, отправляя обновления в интерфейс Javascript. Перенос этих вызовов из asyncio/await в потоки решил проблему.
До этого момента я не видел никаких аномалий данных, и мне никогда не приходило в голову, что они могут быть. Теперь я вижу, что пропускная способность всей моей серверной архитектуры стабильна и проверена... Я отслеживал все сообщения через систему и вижу, что строка запросов обрабатывается, создавая наборы данных размером в несколько мегабайт, и отправляет их. обратно через последнее соединение WS Rxjs с интерфейсом JS. Я вижу, что все сообщения были «отправлены» асинхронным потребителем каналов Daphne/Django, они выполняются быстро, и все данные присутствуют.
Однако я заметил, что около 85 В % случаев в пользовательском интерфейсе JS будет отсутствовать от 1 до 12 ответов с конца переданной последовательности с сервера 1, и они никогда не появятся. Это примерно из 42 соответствующих запросов сообщений, инициированных пользовательским интерфейсом JS и отправленных через WS на сервер 1. Все серверы Python ставят данные в соответствующую очередь, и, как я уже упоминал, я отслеживал доставку каждого сообщения, насколько мог, прежде чем они исчезнут. после отправки сервером 1.
Решения
Пока нет. Возврат кода обратно к «медленному» с использованием транзакций базы данных async/await, очевидно, замедляет работу и, похоже, решает ее. Мне кажется очевидным, что это как-то связано с очередями и буферизацией в WS-соединении между сервером 1 и пользовательским интерфейсом JS. Серия (10-15) маленьких (КБ) и больших (МБ) сообщений, отправленных за период около 1,5 секунд, кажется, вызывает больше всего огорчений. Однако это непоследовательно: разные сообщения пропадают, а иногда все сообщения принимаются. Я повторяю тестирование, просто обновляя страницу (новый сеанс браузера, новое соединение WS, новые рабочие процессы на сервере и т. д.), и вижу другое поведение.
Я пытаюсь копать немного ближе к уровню TCP сервера 1 WS, чтобы убедиться, что пакеты действительно обрабатываются на уровне TCP... Я не выполнил эту проверку. Мне нужно узнать, как просмотреть сеансы TCP в пользовательском интерфейсе JS в браузере.
Другие попытки
Я подумал, может быть, мой Rxjs WS обработчику в браузере требовалось слишком много времени для обработки сообщений, поэтому я попытался добавить «буфер» с помощью объекта Rxjs, который позволил бы обработчику моего WS передать его на обработку синтаксического анализа/форматирования, просто добавив данные в наблюдаемый и подписавшись на него в другом месте службы WS, но это, похоже, не сработало. Мне нужно попробовать очередь отправки с задержкой в ​​приложении сервера 1 в качестве первой попытки использования asyncio.sleep, чтобы посмотреть, улучшит ли ситуацию искусственное замедление.
Идеи< /h3>
Кто-нибудь знает, как углубиться в функции Rxjs WebSocket, чтобы я мог узнать, заполняются ли буферы и удаляются ли сообщения? TCP должен обеспечить доставку сообщения, поэтому я чувствую, что проблема на стороне браузера. Я использую браузер, потому что хочу, чтобы мое приложение не исчезло.

Подробнее здесь: https://stackoverflow.com/questions/792 ... g-messages
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»