Слои каналов позволяют общаться между различными экземплярами приложения. Они являются полезной частью создания распределенного приложения в режиме реального времени, если вы не хотите передавать все свои сообщения или события через базу данных.
На данный момент, наши каналы работают со слоем каналов в памяти. Этот слой может быть полезен при тестировании или для целей локальной разработки.
Но канальные слои InMemory работают с каждым процессом как с отдельным слоем. Это означает, что межпроцессный обмен сообщениями невозможен.
Поскольку основная ценность канальных слоев заключается в обеспечении распределенного обмена сообщениями, использование InMemory приведет к неоптимальной производительности и, в конечном счете, к потере данных в многоэкземплярной среде.
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
}
}
Redis - это сервер структур данных, используемое в качестве базы данных, кэша, брокера сообщений и потокового движка.
Redis предоставляет такие структуры данных, как строки, хэши, списки, наборы, отсортированные наборы с запросами диапазона, растровыми изображениями, гиперлогами, геопространственными индексами и потоками.
Redis имеет встроенную репликацию, скрипты Lua, транзакции и различные уровни сохранения на диске, а также обеспечивает высокую доступность через Redis Sentinel и автоматическое разбиение с помощью кластера Redis.
Для достижения максимальной производительности Redis работает с набором данных в памяти. В зависимости от вашего сценария использования Redis может сохранять ваши данные либо периодически сбрасывая набор данных на диск, либо дополнея каждую команду в журнал на диске. Вы также можете отключить сохранение, если вам просто нужен многофункциональный сетевой кэш в памяти.
Redis поддерживает асинхронную репликацию с быстрой неблокирующей синхронизацией и автоматическим переподключением с частичной повторной синхронизацией при сетевом разделении.
channels_redis - единственный официальный поддерживаемый Django канальный слой, для производственного использования с Redis.
Скачайте и установите Redis с официального сайта. Далее установите необходимый модуль для Django:
pip install channels-redis
Запустите Redis сервер в отдельной консоли следующим образом: redis-server
И настройте слой канала в файле настроек Django следующим образом:
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": ['redis://127.0.0.1:6379',],
},
},
}
Запустим проект, и мы видим что наш чат прекрасно работает через Redis.
Мы можем запустить в новой командной строке следующий запрос:
redis-cli MONITOR
Чтобы смотреть за работой Redis, и при отправке сообщений, мы можем увидеть следующее:
1691935344.207778 [0 127.0.0.1:49520] "ZADD" "asgispecific.38edc255ad8d4de5a069412a0d4202fd!$inflight" "1691935344.206382" "H\x9e\xaa\x93H#\xed\x1f\xf9\xb5`4\x84\xa4type\xactext_message\xa7message\xd90perminoff-ilya@yandex.ru:- Test @2023-08-13 14:2\xa6author\xb8perminoff-ilya@yandex.ru\xb0__asgi_channel__\x91\xd9Jspecific.38edc255ad8d4de5a069412a0d4202fd!a3f44c2d6ab54a479f306b9ddd001d5e"
На этом разработка веб-чата на Django закончена, осталось подвести итоги в следующем разделе.