Ответ
В Redis есть несколько механизмов для реализации функциональности брокера сообщений, основной из которых — Pub/Sub (Publish/Subscribe).
1. Механизм Pub/Sub
Это простая модель, где клиенты-издатели (publishers) отправляют сообщения в именованные каналы (channels), а клиенты-подписчики (subscribers) получают эти сообщения в реальном времени.
Ключевые особенности:
- Fire and Forget: Сообщения не сохраняются. Если подписчик не в сети в момент отправки, он никогда не получит это сообщение.
- Высокая скорость: Минимальные задержки, так как все операции происходят в памяти.
- Подписка по шаблону: Можно подписаться на несколько каналов, используя шаблоны (например,
PSUBSCRIBE news.*).
Пример (Python с redis-py):
# publisher.py
import redis
import time
r = redis.Redis()
r.publish('my-channel', 'Hello, World!')
# subscriber.py
import redis
r = redis.Redis()
p = r.pubsub()
p.subscribe('my-channel')
for message in p.listen():
if message['type'] == 'message':
print(f"Received: {message['data'].decode('utf-8')}")
2. Альтернативы для надежных очередей
Для сценариев, где важна гарантия доставки, используются другие структуры данных Redis:
- Списки (Lists): Команды
LPUSH(добавить в очередь) иBRPOP(блокирующее извлечение) создают надежную очередь FIFO. Сообщения хранятся до тех пор, пока их не заберет обработчик. - Потоки (Streams): Наиболее мощный механизм. Предоставляет персистентные, append-only структуры данных с поддержкой групп потребителей (consumer groups), подтверждением обработки сообщений и возможностью читать историю.