Redis Pub / Sub с надежностью - PullRequest
42 голосов
/ 31 мая 2011

Я рассматривал использование Redis Pub / Sub в качестве замены RabbitMQ.

Насколько я понимаю, pub / sub Redis поддерживает постоянное соединение с каждым из подписчиков, и, если соединение разрывается,все будущие сообщения будут потеряны и брошены на пол.

Одним из возможных решений является использование списка (и блокировка ожидания) для хранения всего сообщения и публикации / подписки как просто механизма уведомления.Я думаю, что это помогает мне пройти большую часть пути, но у меня все еще есть некоторые опасения по поводу случаев сбоя.

  1. что происходит, когда абонент умирает и возвращается в онлайн, как он должен обрабатывать все, что ожидаетсообщения?
  2. когда искаженное сообщение приходит через систему, как вы обрабатываете эти исключения?DeadLetter Queue?
  3. Есть ли стандартная практика для реализации политики повторных попыток?

Ответы [ 3 ]

35 голосов
/ 01 июня 2011

Когда абонент (потребитель) умирает, ваш список будет продолжать расти, пока клиент не вернется.Ваш производитель может урезать список (с любой стороны), как только он достигнет определенного предела, но это то, что вам нужно будет обработать на уровне приложения.Если вы включите отметку времени в каждое сообщение, ваш потребитель сможет затем определить возраст сообщения, если у вас есть логика приложения, которую вы хотите применить к возрасту сообщения.

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

Политики повторных попытоксильно зависит от потребностей вашего приложения.Если вам требуется 100% -ная уверенность в том, что сообщение было получено и обработано, то вам следует рассмотреть возможность использования транзакций Redis (MULTI / EXEC), чтобы обернуть работу, выполненную потребителем, чтобы вы могли гарантировать, что клиент не удалит сообщение, если толькоон завершил свою работу.Если вам необходимо явное подтверждение, то вы можете использовать явное сообщение ACK в очереди, выделенной для процесса (ов) производителя.

Не зная больше о потребностях вашего приложения, трудно понять, как правильно выбирать.Как правило, если ваши сообщения требуют полной защиты ACID, вам, вероятно, также необходимо использовать транзакции redis.Если ваши сообщения имеют смысл только тогда, когда они своевременны, то транзакции могут не понадобиться.Звучит так, как будто вы не можете терпеть пропущенные сообщения, поэтому ваш подход к использованию списка хорош.Если вам нужно реализовать приоритетную очередь для ваших сообщений, вы можете использовать отсортированный набор (Z-команды) для хранения ваших сообщений, используя их приоритет в качестве значения оценки вместе с потребителем опроса.

3 голосов
/ 03 июня 2011

Я использовал отсортированный набор, используя временную метку в качестве оценки и ключ к данным в качестве значения элемента.Я использую счет из последнего элемента, чтобы получить следующие несколько, а затем получить ключи.Как только работа завершена, я оборачиваю zrem и del в транзакцию MULTI / EXEC.

По сути то, что сказал Эдвард, но с поворотом сохранения ключей в отсортированном наборе, поскольку мои сообщения могут быть довольно красивымибольшой.

Надеюсь, это поможет!

0 голосов
/ 06 марта 2018

Если вы хотите, чтобы паб / подсистема, где подписчики не теряли сообщения при смерти, рассмотрите возможность использования Redis Streams вместо Redis Pub / sub.

Redis Streams имеют свои собственныеархитектура и плюсы / минусы Redis Pub / sub.С помощью Redis Streams подписчик может выполнить команду:

последнее полученное мной сообщение было X, теперь дайте мне следующее сообщение;если нового сообщения нет, то дождитесь его поступления.

Статья Антиреса, ссылка на которую приведена выше, является хорошим введением в потоки Redis с дополнительной информацией.

Предостережение: этофункция существует только в нестабильной (бета) версии Redis, как сейчас.

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