Sobes.tech
Назад к вопросам
Junior — Middle
64

Каким образом выбрать очередь для отправки сообщений в RabbitMQ?

Компании, где спрашивали
Медиалогия

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Очередь в RabbitMQ обычно не выбирают напрямую для каждого сообщения — сообщение отправляют на exchange, а уже он маршрутизирует его в нужную очередь по binding key и типу exchange. Если нужна конкретная очередь, важно правильно настроить exchange, routing key и bindings. Для гибкой маршрутизации используют direct, topic или headers exchange.

Определение:

В RabbitMQ сообщение сначала публикуется в exchange, а не в очередь. Exchange принимает решение, в какую очередь или очереди доставить сообщение, на основе типа exchange и правил привязки. Поэтому “выбор очереди” на практике означает выбор механизма маршрутизации: имени exchange, routing key и привязок между exchange и очередью.

Пример использования:

Допустим, есть очередь для заказов и очередь для уведомлений. Сообщения о создании заказа отправляются с routing key order.created, а уведомления — с notification.email. Exchange типа topic распределяет их по соответствующим очередям.

using RabbitMQ.Client;
using System.Text;

var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

channel.ExchangeDeclare("app.exchange", ExchangeType.Topic, durable: true);

channel.QueueDeclare("orders.queue", durable: true, exclusive: false, autoDelete: false);
channel.QueueDeclare("notifications.queue", durable: true, exclusive: false, autoDelete: false);

channel.QueueBind("orders.queue", "app.exchange", "order.*");
channel.QueueBind("notifications.queue", "app.exchange", "notification.*");

var message = "Order 123 created";
var body = Encoding.UTF8.GetBytes(message);

channel.BasicPublish(
    exchange: "app.exchange",
    routingKey: "order.created",
    basicProperties: null,
    body: body);

Пояснение кода:

Код показывает стандартный путь маршрутизации сообщения. Сначала создается exchange app.exchange типа topic, который умеет направлять сообщения по шаблону routing key. Затем объявляются две очереди и связываются с exchange через QueueBind: первая получает все ключи вида order.*, вторая — notification.*. При публикации сообщения с ключом order.created exchange отправит его в orders.queue, потому что шаблон привязки совпадает.

Ключевые моменты:

  • Сообщение отправляют не в очередь, а в exchange.
  • Выбор очереди определяется routingKey и типом exchange.
  • direct подходит для точного совпадения ключа, topic — для шаблонов, headers — для маршрутизации по заголовкам.
  • Если ни одна привязка не подошла, сообщение может быть потеряно, если не настроен alternate exchange или mandatory-публикация.
  • Очередь должна быть заранее объявлена и привязана к exchange.
  • Для C# важно отдельно настраивать exchange, queue и bind перед BasicPublish.