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

Ответ

В 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).

Ответ 18+ 🔞

А, RabbitMQ, ёпта! Ну, обменники — это вообще отдельная песня, там без пол-литра не разберёшься. Я их все на практике перепробовал, сейчас тебе по косточкам разложу, чтобы понятно было, какого хуя каждый нужен.

Direct Exchange — это как почтальон Печкин, только не дурак. Ты ему говоришь точный адрес (routing key), и он письмо только в один конкретный ящик суёт. Идеально для задач, где всё чётко и по плану. Вот смотри, допустим, у тебя заказы летят:

// Хочешь, чтобы задание на оплату обрабатывала именно очередь для оплаты? Вот тебе ключ 'payment' и вперёд.
channel.publish('orders.direct', 'payment', Buffer.from('Order data'));

Никаких тебе сюрпризов, всё попадает куда надо. Доверия к нему — ебать ноль, потому что он тупой как пробка, но зато надёжный.

Fanout Exchange — это уже полный пиздец, в хорошем смысле. Представь крикнуть в мегафон на площади. Кто услышал — тот услышал. Он плюёт с высокой колокольни на твой routing key и копию сообщения пихает во ВСЕ очереди, что к нему привязаны. Я его использовал, когда нужно было всем сервисам прокричать: «Эй, мудаки, конфиг поменялся, перечитайте!». Рассылка мгновенная, овердохуища получателей.

Topic Exchange — вот тут начинается магия, блядь. Это уже не просто адрес, а целые шаблоны с звёздочками и решётками. Одна очередь может слушать logs.error.*, а другая — app.#. Это мощь, когда у тебя система событий разрослась, как грибы после дождя. Пример из жизни: логирование.

// Кидаешь событие с ключом "app.eu.order.created", а его ловит вся очередь, которая подписана на "app.eu.order.*"
channel.publish('logs.topic', 'app.eu.order.created', Buffer.from('Log entry'));

Гибкость — пиздец, но и мозги надо включать, чтобы не нагородить хуйни в названиях ключей.

Headers Exchange — а это уже для самых хитрых жоп, которые считают, что ключей им мало. Тут маршрутизация идёт по заголовкам сообщения. Типа, «отправь это сообщение только если в заголовках есть format=json И priority=high». Использовал, когда логика была такая извращённая, что в routing key её уже не впихнуть. Сильная штука, но и сложная, как чёрт в душу.

Default Exchange — это типа дефолтный обменник, который уже есть, имя у него — пустая строка "". Каждая созданная очередь автоматом к нему привязывается с routing key, равным своему же имени. По сути, это частный случай Direct. Удобно для простых тестов или когда лень заморачиваться, но в продакшене на него лучше не рассчитывать — манда с ушами получается, негибкая.

Короче, выбор, блядь, зависит от того, что тебе надо: тыкать в одну точку (Direct), орать на всю площадь (Fanout), играть в умные шаблоны (Topic) или выёбываться с заголовками (Headers). Главное — не перемудрить, а то получится пиздопроебина, а не архитектура.