Почему Redis Pub/Sub не гарантирует доставку сообщений

Ответ

Redis Pub/Sub работает по принципу "fire-and-forget" (отправил и забыл) и не предоставляет гарантий доставки сообщений. Если в момент публикации сообщения у канала нет активных подписчиков или подписчик отключается, сообщение будет безвозвратно утеряно.

Ключевые причины отсутствия гарантий:

  • Нет персистентности: Сообщения не сохраняются на диске и не ставятся в очередь. Они передаются напрямую активным подписчикам в режиме реального времени.
  • Отсутствие подтверждений (acknowledgements): Протокол не предусматривает механизма, по которому подписчик мог бы подтвердить получение сообщения. Издатель не знает, было ли сообщение кем-либо получено.

Преимущества этого подхода:

  • Высокая производительность: Минимальная задержка, так как нет накладных расходов на запись в очередь и ожидание подтверждений.
  • Простота: Легко реализовать и использовать для задач, где потеря отдельных сообщений некритична (например, рассылка уведомлений в реальном времени, инвалидация кеша).

Когда использовать:

Подходит для систем, где важна скорость, а не 100% надежность доставки. Например, для обновления данных на дашбордах в реальном времени.

Альтернатива в Redis:

Для гарантированной доставки сообщений в Redis следует использовать Redis Streams, которые предоставляют персистентные структуры данных, группы потребителей и механизм подтверждения обработки сообщений.

Ответ 18+ 🔞

Да ты послушай, какая дичь, блядь! Этот ваш Redis Pub/Sub — он работает по принципу «пшикнул и забыл», ёпта. То есть отправил сообщение и пошёл нахуй, а долетело оно или нет — это уже не твои заботы, чувак. Если в этот самый момент на канале ни одна живая душа не сидит, или подписчик только что отвалился — всё, пиши пропало. Сообщение сгорает, как хуй в проруби, и никто его уже не увидит.

Почему так, нахуй?

  • Никакого сохранения, блядь: Сообщения на диск не пишутся, в очередь не встают. Летят прямо в сокеты тем, кто тут и сейчас слушает. Нет слушателей — нет и сообщения, вот и вся магия, ебать.
  • Подтверждений — ноль, абсолютный ноль: Тут тебе не почта с уведомлением о вручении. Издатель отправил и спит спокойно. А получил ли кто? Хуй его знает. Протокол такой, хитрая жопа.

Но зато какие плюсы, ёбана!

  • Скорость — овердохуища: Всё летит мгновенно, потому что не тратится время на всякую хуйню вроде записи в очередь и ожидания ответных писем.
  • Простота — хуй с горы: Включил, подписался, получай. Идеально для задач, где потеря пары сообщений — не конец света. Ну не дошло одно уведомление о лайке, ебать, мир не рухнет.

Так когда его юзать-то?

Да когда нужна скорость, а не надёжность, блядь! Например, чтобы на какой-нибудь панели управления цифры в реальном времени обновлялись. Потерял один пакет — да похуй, через полсекунды новый прилетит.

А если надо, чтобы гарантированно дошло?

А вот если тебе реально важно, чтобы каждое сообщение было обработано, то ты, дружок, не туда смотришь. Тебе нужны Redis Streams, ёпта! Вот это уже серьёзная тема: сообщения сохраняются, есть группы потребителей, и можно подтвердить, что обработал. Это уже почти как какая-нибудь Kafka, только попроще. Вот туда и иди, если тебе не «fire-and-forget», а «fire-and-ensure-this-motherfucker-gets-delivered».