Ошибка ReadOnlyError в Django-аппликации с Redis и DjangoCannels

У меня есть приложение Django, использующее DgangoChannels, Djangochannelrestframework. Оно устанавливает websocket-соединение с фронтендом ReactJS. В качестве канальных слоев я использую Redis следующим образом

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("redis", 6379)],
        },
    },
}

Redis и Django работают в docker. Моя установка redis в docker следующая

  redis:
    image: "redis:7.0.4-alpine"
    command: redis-server
    ports:
      - "6379:6379"
    networks:
      - nginx_network

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

ReadOnlyError at /admin/operations/operation/add/
READONLY You can't write against a read only replica.
Request Method: POST
Request URL:    http://62.84.123.168/admin/operations/operation/add/
Django Version: 3.2.12
Exception Type: ReadOnlyError
Exception Value:    
READONLY You can't write against a read only replica.
Exception Location: /usr/local/lib/python3.8/site-packages/channels_redis/core.py, line 673, in group_send
Python Executable:  /usr/local/bin/python
Python Version: 3.8.13
Python Path:    
['/opt/code',
 '/usr/local/bin',
 '/usr/local/lib/python38.zip',
 '/usr/local/lib/python3.8',
 '/usr/local/lib/python3.8/lib-dynload',
 '/usr/local/lib/python3.8/site-packages']
Server time:    Tue, 02 Aug 2022 08:23:18 +0300

Я понимаю, что это как-то связано с репликацией Redis, но не знаю, почему она падает через некоторое время и как это исправить

У меня такая же ошибка, возможное решение здесь

Исправьте это, добавив команду в docker и отключив конфигурацию replica-read-only, добавьте это в ваш redis docker compose

command: redis-server --appendonly yes --replica-read-only no

тогда вы можете попробовать проверить, отключена ли команда replica-read-only using​redis-cli > config get replica-read-only, если результат отрицательный, то команда успешно отключена.

Вернуться на верх