Требует ли модель redis pub / sub постоянных подключений к redis? - PullRequest
17 голосов
/ 05 октября 2011

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

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

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

Ответы [ 3 ]

43 голосов
/ 06 октября 2011

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

  • Fire и Forget / One to Many: Pub / Sub.Во время публикации сообщения все подписчики получат его, но это сообщение будет потеряно навсегда.Если клиент не был подписан, он никак не может его вернуть.
  • Сохраняющиеся очереди / один-к-одному: списки, возможно используемые с командами блокировки, такими как BLPOP.Со списками у вас есть производитель, проталкивающий список, и один или несколько потребителей ожидают элементов, но одно сообщение достигнет только одного из ожидающих клиентов .Со списками у вас есть постоянство, и сообщения будут ждать клиента, чтобы выскочить их вместо исчезновения.Поэтому, даже если никто не слушает, существует отставание (настолько большое, насколько у вас есть доступная память, или вы можете ограничить его с помощью LTRIM).

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

  • LPUSH / RPUSH, RPOP / LPOP, BRPOP / BLPOP
  • ОПУБЛИКОВАТЬ, ПОДПИСАТЬСЯ, PSUBSCRIBE

Документ для этой команды доступен на redis.io

2 голосов
/ 05 октября 2011

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

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

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

1 голос
/ 05 октября 2011

Используйте BLPOP вместо LPOP

...