Почему redis сообщает об отсутствии подписчиков на канал после того, как я подписался на этот канал без ошибок?
Я пытаюсь отправить обратную связь в реальном времени через вебсокеты, и я делаю это, отправляя данные через redis с rest-api сервера на websocker сервер (оба написаны на python/django). На сервере websocket я подписываюсь на канал с именем "events" следующим образом:
redis_connection = redis.Redis(
host=settings.REDIS_HOST,
port=settings.REDIS_PORT,
db=settings.REDIS_CACHE_DB,
)
pubsub = redis_connection.pubsub()
pubsub.subscribe(events=process_event)
На сервере rest-api я публикую данные в тот же канал redis следующим образом:
connection.publish("events", json.dumps({"user_email": user.email, "message": message}))
Пытаясь понять, почему ни одно событие не попадает в обработчик "process_event", я обнаружил, что метод publish возвращает количество подписчиков на канал, поэтому я обновил эту строку до следующей:
count = connection.publish("events", json.dumps({"user_email": user.email, "message": message}))
print(f"Published to events channel with {count} subscribers")
Результат всегда 0, даже после подписки, описанной выше. Зайдя в Docker-контейнер redis-stack, я увидел следующее, когда я напрямую попытался запросить количество подписчиков:
redis-cli
127.0.0.1:6379> PUBSUB NUMSUB events
- "events"
- (целое число) 0
127.0.0.1:6379>
В журналах самого стека redis, похоже, не распознается ни подписка, ни публикация. Однако, если я использую команду "redis-cli monitor", то вижу, что и то, и другое отображается:
1727460056.950779 [0 172.17.0.1:58210] "CLIENT" "SETINFO" "LIB-NAME" "redis-py" 1727460056.952892 [0 172.17.0.1:58210] "CLIENT" "SETINFO" "LIB-VER" "5.0.8" 1727460056.954072 [1 172.17.0.1:58210] "SELECT" "1"
.
1727460056.956442 [1 172.17.0.1:58210] "SUBSCRIBE" "events"
1727460122.677189 [0 172.17.0.1:45874] "CLIENT" "SETINFO" "LIB-NAME" "redis-py" 1727460122.678973 [0 172.17.0.1:45874] "CLIENT" "SETINFO" "LIB-VER" "5.0.8" 1727460122.681286 [1 172.17.0.1:45874] "SELECT" "1"
.
1727460122.683120 [1 172.17.0.1:45874] "PUBLISH" "events" "{"user_email": "admin@domain.com", "message": "Содержание сообщения"}"
.
После всего этого события PUBSUB NUMSUB по-прежнему дают тот же результат.
Поэтому, почему вы не получаете никаких событий, потому что это не сокет, вы не получаете push-уведомления, pubsub
объект, который вы создали, должен получать сообщения:
redis_pubsub.get_message()
Почему вы получаете 0 на NUMSUB
- я подозреваю, что ваш клиент не подключен, когда вы отправляете сообщение.
У вас запущено два процесса, и субклиент закрывается, когда служба переходит в спящий режим или очищается, поскольку у него больше нет задач (если вы не дадите ему какую-нибудь другую задачу, например, проверить, пришло ли сообщение, он может выйти за пределы области видимости и быть сброшенным).