Какие типы exchange существуют в RabbitMQ и для чего они используются?

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

Ответ

В RabbitMQ exchange определяет, как сообщение будет маршрутизировано в очереди. Я использовал все основные типы в разных сценариях:

  1. Direct Exchange: Маршрутизация по точному совпадению routing key. Идеален для точечной отправки задач. Например, для обработки заказов разного типа:

    // Отправка сообщения в очередь для обработки именно "payment"
    channel.publish('orders.direct', 'payment', Buffer.from('Order data'));
  2. Fanout Exchange: Рассылает сообщения во все привязанные очереди, игнорируя routing key. Использовал для широковещательных событий, например, уведомления всех сервисов о смене конфигурации.

  3. Topic Exchange: Мощный тип для маршрутизации по шаблонам (* — одно слово, # — ноль или несколько слов). Незаменим для сложных систем событий. Пример из проекта логирования:

    // Сообщение с ключом "app.eu.order.created" попадет в очередь, привязанную с шаблоном "app.eu.order.*"
    channel.publish('logs.topic', 'app.eu.order.created', Buffer.from('Log entry'));
  4. Headers Exchange: Маршрутизация на основе заголовков сообщения (x-match: all/any). Применял, когда логика маршрутизации слишком сложна для ключей, например, отправка сообщения в очередь, если в заголовках есть format=json И priority=high.

  5. Default Exchange: Предопределенный exchange с именем "" (пустая строка). Каждая очередь автоматически привязывается к нему с routing key, равным имени очереди. Удобно для простых случаев прямой отправки.

Выбор типа зависит от паттерна маршрутизации: точечная задача (Direct), широковещание (Fanout), гибкая маршрутизация событий (Topic) или сложная логика на заголовках (Headers).