Redis-py: обработчик событий run_in_thread перестает вызываться через несколько часов

#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 и в инфраструктуре.