Direct¶
Direct Channel - базовый способ маршрутизации сообщений в Redis. Его суть очень проста:
channel отправляет сообщения всем потребителям, подписанным на него.
Масштабирование¶
Если один канал слушает несколько потребителей, сообщение будет получено всеми потребителями этого канала. Таким образом, горизонтальное масштабирование путем увеличения количества сервисов-потребителей невозможно только средствами Redis Pub/Sub.
Если вам нужен подобный функционал, посмотрите в сторону Redis Streams или других брокеров (например, Nats или RabbitMQ).
Пример¶
Direct Channel - тип, используемый в Propan по умолчанию: вы можете просто объявить его следующим образом
@broker.handler("test_channel")
async def handler():
...
Полный пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
Объявление потребителей¶
Для начала мы объявили несколько потребителей для двух каналов test и test2:
8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Note
Обратите внимание, что handler1 и handler2 подписаны на один channel:
cообщения будут приходить оба этих обработчика.
Распределение сообщений¶
Теперь распределение сообщений между этими потребителями будет выглядеть следующим образом:
await broker.publish("", "test") # handlers: 1, 2
Сообщение 1 будет отправлено в handler1 и handler2, т.к. они слушают channel с названием test
await broker.publish("", "test2") # handlers: 3
Сообщение 2 будет отправлено в handler3, т.к. он слушает channel с названием test2