Когда события Redis PUB / SUB запускаются и забываются? - PullRequest
0 голосов
/ 20 февраля 2020

События Redis запускаются и забываются. Если никто не слушает, они просто останутся незамеченными. Там нет истории. Но нигде в inte rnet я не нашел ничего, что отвечало бы на следующий вопрос (я использую redis-py и aioredis для python):

Нужно ли на самом деле СЛУШАТЬ код событиям, чтобы получить его, или будут ли события кэширования соединения Redis для меня?

Предположим, у меня есть это l oop:

redis_db = Redis(...)

while True:
    print("Hey, I'm listening now!")
    msg = redis_db.blocking_subscribe("some_topic") # pseudo-code, because I'm using various libraries
    if msg == "calc":
        do_a_heavy_5_seconds_calculation()
        print("YAY, I was busy and am back up now!")

Итак, я пропущу все события, которые происходят в расчете 5s или будет ли мой redis_db кешировать их для меня?

Другими словами ... применимо ли срабатывание "забыть", если у меня нет соединения или если у меня есть соединение, но я не слушаю ?

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Как вы упомянули, если вы используете Redis Pub / Sub, это пожар, и вы забыли, поэтому ваше приложение должно быть запущено и слушать событие.

Я должен сказать, что у меня есть не проверял ваш вариант использования.

Чтобы ваши логики c имели больший контроль, я бы посоветовал вам взглянуть на Redis Streams .

  • Сначала все, это не «забыл и забыл» опубликованную sh -подписку, но более гибкую систему обмена сообщениями.
  • Ваше приложение будет контролировать, какие сообщения читать, какие читать и отправлять подтверждение при чтении. .

Ваш псевдокод будет очень легко реализовать с помощью Streams, с лучшим контролем.

1 голос
/ 20 февраля 2020

Это немного и того и другого. Вам необходимо соединение И это соединение должно быть в состоянии «подписка». Как только вы выполните метод «blocking_subscribe», вы фактически изменили это состояние соединения на «состояние подписки», поэтому redis продолжит буферизовать эти сообщения для вас, независимо от того, занят ли ваш поток python обработкой других сообщений одновременно. Теперь, конечно, если по какой-либо причине произойдет сбой, буфер соединения на стороне сервера будет потерян.

0 голосов
/ 20 февраля 2020

«Огонь и забудь» относится к контракту сервера с клиентом. Это означает, что сообщение будет отправлено только один раз, при условии, что клиент подключен. Если сообщение потеряно в сети и никогда не попадает к клиенту, то это так. Если сообщение доходит до клиента и клиентский процесс / сервер падает перед его чтением, то это так.

В вашем случае клиент (redis-py) прослушивает сетевой сокет, который устанавливает соединение с сервер. Сам сокет обрабатывается ОС и буферизует входящие сообщения. Пока вы продолжаете сливать сокет, читая из него сообщения, не теряются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...