Гарантирует ли Redis доставку сообщений?

«Гарантирует ли Redis доставку сообщений?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В стандартном режиме Pub/Sub — нет, это механизм fire-and-forget без persistence. Если подписчик отключится, он потеряет сообщения, отправленные в период простоя.

Для гарантированной доставки в Redis используются Streams. Они позволяют:

  • Хранить сообщения
  • Организовывать consumer groups
  • Подтверждать обработку (ack)
  • Контролировать повторные доставки

Пример работы с Redis Streams на PHP (используя библиотеку phpredis):

// Продюсер добавляет сообщение в поток
$redis->xAdd('orders_stream', '*', ['user_id' => 123, 'status' => 'pending']);

// Консьюмер читает неподтверждённые сообщения из своей группы
$messages = $redis->xReadGroup(
    'orders_group',
    'consumer_1',
    ['orders_stream' => '>'],
    1
);

// После успешной обработки сообщение подтверждается
if (processOrder($messages[0])) {
    $redis->xAck('orders_stream', 'orders_group', [$messages[0]['id']]);
}

Таким образом, выбор между Pub/Sub и Streams зависит от требований к надёжности: Pub/Sub для событий в реальном времени, где потеря допустима; Streams — для критичных сообщений, которые должны быть обработаны гарантированно.