Ответ
В стандартном режиме 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 — для критичных сообщений, которые должны быть обработаны гарантированно.