#python #redis #publish-subscribe #redis-py
#python #redis #опубликовать-подписаться #redis-py
Вопрос:
Я пытаюсь реализовать базовый pubsub с помощью клиента redis-py. Идея в том, что издатель на самом деле является обратным вызовом, который периодически вызывается и публикует некоторую информацию о channel1 в функции обратного вызова.
Подписчик прослушает это сообщение по этому каналу и выполнит соответствующую обработку.
Подписчик на самом деле является базовым веб-сервером, развернутым на k8s, и он просто должен отображать сообщения, которые он получает через функцию event_handler .
subscriber.py
class Sub(object):
def __init___(self):
redis = Redis(host=...,
port=...,
password=...,
db=0)
ps = redis.pubsub(ignore_subscribe_messages=True)
ps.subscribe(**{'channel1': Sub.event_handler})
ps.run_in_thread(sleep_time=0.01, daemon=True)
@staticmethod
def event_handler(msg):
print("Hello from event handler")
if msg and msg.get('type') == 'message': # interested only in messages, not subscribe/unsubscribe/pmessages
# process the message
publisher.py
redis = Redis(host=...,
port=...,
password=...,
db=0)
def call_back(msg):
global redis
redis.publish('channel1', msg)
Вначале сообщения публикуются, а обработчик событий подписчика печатает и обрабатывает его правильно.
Проблема в том, что через несколько часов подписчик перестает отображать эти сообщения. Я проверил журналы издателя, и сообщения определенно отправляются, но я не могу понять, почему event_handler не вызывается через несколько часов.
Оператор print в нем перестает печататься, поэтому я говорю, что обработчик не запускается через несколько часов.
Изначально я подозревал, что поток, должно быть, умер, но при запуске в систему я вижу его в списке потоков. Я прочитал много блогов, документации, но не нашел большой помощи.
Все, что я могу сделать, это то, что обработчик событий перестает вызываться через некоторое время. Кто-нибудь может помочь понять, что происходит, и лучший способ надежного использования сообщений pubsub неблокирующим способом?
Очень ценю любые ваши идеи, ребята! 🙁
Ответ №1:
не могли бы вы опубликовать все puplisher.py
, пожалуйста? Это может быть случай, который call_back(msg)
больше не вызывается.
Чтобы проверить, подписан ли клиент, вы можете использовать команду PUBSUB CHANNELS
in reds-cli
.
С уважением, Мартин
Комментарии:
1. Спасибо за ваш ответ! Я проверил, что обратный вызов издателя вызывается в журналах. Я проверил хост redis и выполнил команду PUBSUB NUMSUB channel1, и в нем указано 0 подписчиков. Однако при subscriber.py перезапуск, он показывает 1 подписчика, как и должно быть, поэтому я считаю, что по какой-то причине соединение не поддерживается, все это развернуто на k8s, если это поможет
2. Проверьте время ожидания соединения в Redis и в инфраструктуре.