Требует ли модель публикации/подписки redis постоянных подключений к redis?

В веб-приложении, если мне нужно записать событие в очередь, я бы подключился к Redis, чтобы записать событие.

Теперь, если я хочу, чтобы другой серверный процесс (скажем, демон или задание cron) обрабатывал или реагировал на публикацию события в Redis, нужно ли мне постоянное соединение?

Немного запутался в том, как этот процесс публикации/подписки работает в веб-приложении.


person codecompleting    schedule 05.10.2011    source источник
comment
Несколько простых (1-строчный патч) идей по добавлению постоянства для PubSub изначально в Redis — abhinavsingh.com/   -  person Abhinav Singh    schedule 26.04.2015


Ответы (2)


По сути, в Redis есть две разные модели обмена сообщениями:

  • Выстрелил и забыл / Один ко многим: Pub/Sub. Когда сообщение ПУБЛИКУЕТСЯ, его получают все подписчики, но это сообщение теряется навсегда. Если клиент не был подписан, вернуть его невозможно.
  • Сохраняющиеся очереди/один к одному: списки, возможно используемые с блокирующими командами, такими как BLPOP. Со списками у вас есть производитель, который вставляет данные в список, и один или несколько потребителей, ожидающих элементов, но одно сообщение дойдет только до одного из ожидающих клиентов. Со списками у вас есть постоянство, и сообщения будут ждать, пока клиент вытолкнет их, а не исчезнут. Таким образом, даже если никто не слушает, остается отставание (столько же, сколько ваша доступная память, или вы можете ограничить отставание с помощью LTRIM).

Я надеюсь, что это ясно. Я предлагаю вам изучить следующие команды, чтобы лучше понять Redis и семантику обмена сообщениями:

  • ЛПУШ/РПУШ, РПОП/ЛПОП, БРПОП/БЛПОП
  • ПУБЛИКУЙТЕ, ПОДПИСЫВАЙТЕСЬ, ПОДПИСЫВАЙТЕСЬ

Документация по этим командам доступна на redis.io.

person antirez    schedule 06.10.2011
comment
так что мне нужно постоянное соединение в качестве подписчика? - person codecompleting; 06.10.2011
comment
С Pub/Sub, да. Посмотрите на это для примера того, как добиться постоянных сообщений с помощью Pub/Sub и пользовательского клиента ruby. - person cbrauchli; 08.10.2011

Я не совсем уверен, но я считаю, что да, pub/sub требует постоянного соединения.

В качестве альтернативы я бы взглянул на resque и как он с этим справляется. Вместо использования pub/sub он просто добавляет элемент в список в Redis, а затем любое задание демона или cron, которое у вас есть, может использовать команду lpop для получения первого.

Извините, что дал только псевдоответ, а затем вилку.

person rm-rf    schedule 05.10.2011