Сохранение групп каналов django при развертывании в рабочей среде с использованием нескольких экземпляров сервера

#django #redis #production #django-channels

#django #redis #рабочая среда #django-channels

Вопрос:

Я развертываю свое приложение django, которое использует веб-сокеты (django channels 2) для производства. Использование балансировщика нагрузки и двух экземпляров приложений с nginx / gunicorn пока работает нормально, но меня интересует масштабируемость части websockets.

Как я могу создать масштабируемую архитектуру веб-сокетов, которая будет совместно использовать группы каналов django среди разных экземпляров сервера?

Я использую websockets для функций чата, поэтому я должен убедиться, что пользователи, добавленные в определенную группу, смогут отправлять / получать сообщения от всех других пользователей в той же комнате чата, независимо от того, на какой экземпляр сервера укажет балансировщик нагрузки.

Моей первой мыслью было просто использовать отдельный удаленный сервер только для redis, но я знаю, что вертикальная масштабируемость в конечном итоге подойдет к концу. Что произойдет, когда мне нужно будет масштабировать серверы redis по горизонтали?

Я уже использовал настройку gunicorn daphne, но только с низким трафиком / для тестирования разработчиков. Я еще не пробовал масштабировать каналы django по горизонтали.

Комментарии:

1. Я думаю , что балансировщик нагрузки завершится на уровне сервера — поэтому, как только соединение установлено, оно застряло на этом сервере (по уважительной причине). Как вы определяете, в какие комнаты чата входит пользователь? (URL и т. Д.).

2. Я не думаю, что это хорошая идея, чтобы ваш сервер redis находился на той же логической машине, что и приложение в рабочей среде, с каналами или без них. То же самое относится и к БД. Они должны иметь свои собственные серверы, чтобы вы не теряли доступ ко всему, когда сервер приложений выходит из строя. Теперь, если у вас есть redis на другом сервере, то на самом деле не имеет значения, сколько экземпляров сервера чата вы используете, поскольку имена групп и имена каналов хранятся на сервере redis, к которому все они имеют доступ

3. @jheld Я определяю комнату чата на основе URL-адреса. Я обязательно перейду на отдельный сервер redis, мне просто интересно, что произойдет, когда одного экземпляра сервера redis будет недостаточно для обработки трафика (но, возможно, redis действительно эффективен, я его еще не тестировал)

4. Согласен с вышеизложенным о том, как работает channels_redis. При запуске соединения вы добавите эту группу чата, а затем соответствующим образом сконструируете методы обработчика. Redis сохранит всю информацию о группе и подключении для вас.