Ответ
В 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).