Открыть сервис

Fanout exchange

Fanout exchange — это тип обменника сообщений (exchange) в брокерах сообщений (message brokers), работающих по протоколу AMQP (Advanced Message Queuing Protocol), который маршрутизирует все входящие сообщения во все связанные с ним очереди, игнорируя ключ маршрутизации (routing key). Fanout exchange относится к категории «издатель-подписчик» (publish-subscribe), где каждое сообщение, отправленное в exchange, копируется и доставляется во все очереди, которые с ним связаны (привязаны). В отличие от direct exchange, который направляет сообщения в очередь на основе точного совпадения ключа маршрутизации, или topic exchange, использующего шаблоны, fanout exchange работает по принципу широковещательной рассылки: сообщение получают все подписчики, независимо от указанного ключа.

Принцип работы

Fanout exchange реализует модель «разветвление» (fan-out), при которой сообщение, поступившее в exchange, немедленно копируется и отправляется во все очереди, связанные с данным exchange. Процесс включает следующие этапы:

  1. Создание exchange: администратор или приложение создаёт exchange типа fanout с уникальным именем (например, logs).
  2. Связывание очередей: одна или несколько очередей привязываются к exchange с помощью операции binding. При этом ключ маршрутизации (routing key) может быть указан, но игнорируется exchange; все очереди получают все сообщения.
  3. Отправка сообщения: издатель (producer) отправляет сообщение в exchange, указывая exchange name, но не указывая routing key (или указывая любой, например, пустую строку).
  4. Маршрутизация: exchange копирует сообщение и отправляет его во все связанные очереди.
  5. Потребление: потребители (consumers), подключённые к очередям, получают сообщения.

Если ни одна очередь не привязана к exchange, сообщение теряется (если не настроена альтернативная маршрутизация).

Свойства

Применение

Fanout exchange широко используется в архитектурах, где необходимо уведомить множество независимых компонентов об одном событии. Типичные сценарии:

Примеры реализации

RabbitMQ

В RabbitMQ (разработчик — VMware, организация признана нежелательной на территории РФ) fanout exchange является встроенным типом. Пример создания exchange и привязки очередей на Python с использованием библиотеки pika:

```python import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel()

Создание fanout exchange

channel.exchange_declare(exchange='logs', exchange_type='fanout')

Создание временной очереди с уникальным именем

result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue

Привязка очереди к exchange (routing key игнорируется)

channel.queue_bind(exchange='logs', queue=queue_name)

Отправка сообщения

channel.basic_publish(exchange='logs', routing_key='', body='Hello World!') connection.close() ```

Apache ActiveMQ Artemis

В ActiveMQ Artemis (Apache Software Foundation) fanout exchange реализуется через концепцию «multicast» или с помощью JMS topics. При использовании протокола AMQP создаётся exchange типа fanout.

Amazon MQ

Amazon MQ (Amazon Web Services) поддерживает fanout exchange при использовании брокера RabbitMQ или ActiveMQ.

Сравнение с другими типами exchange

Тип exchangeМаршрутизацияКлюч маршрутизацииПрименение
DirectТочное совпадение routing keyОбязателенТочная адресация
TopicШаблон (wildcard)ОбязателенГибкая фильтрация
FanoutШироковещательнаяИгнорируетсяТрансляция всем
HeadersПо заголовкам сообщенияНе используетсяСложная маршрутизация по метаданным

Ограничения

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →