Ответ
В RabbitMQ exchange определяет, как сообщение будет маршрутизировано в очереди. Я использовал все основные типы в разных сценариях:
-
Direct Exchange: Маршрутизация по точному совпадению
routing key. Идеален для точечной отправки задач. Например, для обработки заказов разного типа:// Отправка сообщения в очередь для обработки именно "payment" channel.publish('orders.direct', 'payment', Buffer.from('Order data')); -
Fanout Exchange: Рассылает сообщения во все привязанные очереди, игнорируя
routing key. Использовал для широковещательных событий, например, уведомления всех сервисов о смене конфигурации. -
Topic Exchange: Мощный тип для маршрутизации по шаблонам (
*— одно слово,#— ноль или несколько слов). Незаменим для сложных систем событий. Пример из проекта логирования:// Сообщение с ключом "app.eu.order.created" попадет в очередь, привязанную с шаблоном "app.eu.order.*" channel.publish('logs.topic', 'app.eu.order.created', Buffer.from('Log entry')); -
Headers Exchange: Маршрутизация на основе заголовков сообщения (x-match: all/any). Применял, когда логика маршрутизации слишком сложна для ключей, например, отправка сообщения в очередь, если в заголовках есть
format=jsonИpriority=high. -
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). Главное — не перемудрить, а то получится пиздопроебина, а не архитектура.