Ответ
В проекте использовались RabbitMQ и Azure Service Bus, каждый для своих задач.
RabbitMQ применялся для внутренней коммуникации между микросервисами благодаря его высокой производительности, гибкой маршрутизации по протоколу AMQP и открытой лицензии. Он отлично подходил для сценариев, где требовалась сложная топология обмена сообщениями (публикация/подписка, рабочие очереди).
Пример объявления очереди и получения сообщений на C#:
var factory = new ConnectionFactory() { HostName = "rabbitmq-host" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
// Объявление устойчивой (durable) очереди
channel.QueueDeclare(queue: "order-queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
// Обработка сообщения
ProcessOrder(message);
// Подтверждение обработки
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
// Отключение autoAck для ручного подтверждения
channel.BasicConsume(queue: "order-queue",
autoAck: false,
consumer: consumer);
Azure Service Bus использовался для интеграции с облачной экосистемой Azure и в сценариях, где критична гарантированная доставка и строгий порядок сообщений (очереди и топики). Его преимущества — встроенная отказоустойчивость, управление сессиями и интеграция с другими сервисами Azure (Logic Apps, Functions).
Критерии выбора:
- RabbitMQ: Для высокопроизводительного обмена внутри кластера, сложных маршрутизаций, когда нужен полный контроль над инфраструктурой.
- Azure Service Bus: Для облачных гибридных сценариев, когда важны SLA, управляемость и интеграция с PaaS-сервисами Microsoft.