Какую библиотеку вы использовали для работы с RabbitMQ в .NET?

Ответ

Для непосредственной работы с протоколом AMQP использовал официальную библиотеку RabbitMQ.Client. Для более высокоуровневых проектов — MassTransit.

1. RabbitMQ.Client (низкоуровневый контроль): Идеален, когда нужен полный контроль над соединением, каналами, QoS и топологией.

using RabbitMQ.Client;
using System.Text;

// Публикация сообщения
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

// Объявление очереди (идемпотентная операция)
channel.QueueDeclare(queue: "orders", durable: true, exclusive: false, autoDelete: false);

var message = "New order #123";
var body = Encoding.UTF8.GetBytes(message);

// Публикация с persistent флагом для сохранения при перезагрузке брокера
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: "", routingKey: "orders", basicProperties: properties, body: body);

2. MassTransit (высокоуровневая абстракция): Используется в сложных распределенных системах. Он абстрагирует RabbitMQ, предоставляет встроенную поддержку шаблонов (publish/subscribe, request/response), сериализации, повторных попыток и мониторинга.

// Конфигурация в Startup/Program.cs
services.AddMassTransit(x =>
{
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost");
        cfg.ConfigureEndpoints(context); // Авторегистрация потребителей
    });
});

// Публикация сообщения через IBus
await bus.Publish(new OrderCreatedEvent { OrderId = 123 });

Выбор зависит от задачи:

  • RabbitMQ.Client — для простых интеграций или когда важны тонкие настройки AMQP.
  • MassTransit (или EasyNetQ) — для enterprise-приложений, где важна надежность, тестируемость и готовые паттерны.

Ответ 18+ 🔞

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

В общем, есть два основных пути, и оба ведут в ад, но разными дорогами.

Первый путь — для мазохистов и контроль-фриков: RabbitMQ.Client

Это когда ты хочешь всё чувствовать своими руками. Каждое соединение, каждый канал, каждый бит QoS. Как будто собираешь движок из деталей, разбросанных по гаражу.

using RabbitMQ.Client;
using System.Text;

// Подключаемся, как будто втыкаем вилку в розетку
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

// Объявляем очередь. Сделал раз — и всё, больше не нужно. Идемпотентно, блядь!
channel.QueueDeclare(queue: "orders", durable: true, exclusive: false, autoDelete: false);

var message = "New order #123";
var body = Encoding.UTF8.GetBytes(message);

// А вот тут магия: говорим, чтобы сообщение пережило перезагрузку брокера
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
// И шлём нахуй в очередь
channel.BasicPublish(exchange: "", routingKey: "orders", basicProperties: properties, body: body);

Чувствуешь? Чувствуешь эту власть? Ты тут бог и царь. И главный по тарелкам. Но и отвечаешь за всё: за повторные отправки, за обработку ошибок, за конфигурацию топологии. Заебёшься, но зато сам.

Второй путь — для ленивых гениев: MassTransit

А это уже для тех, кто не хочет париться. Типа "я архитектор, у меня мысли глобальные, а не о том, как правильно BasicAck вызвать". Библиотека берёт на себя всю эту низкоуровневую ебучу: шаблоны, повторы, сериализацию, мониторинг.

// Настраиваем где-нибудь в Program.cs и забываем, как страшный сон
services.AddMassTransit(x =>
{
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost");
        cfg.ConfigureEndpoints(context); // Оно само всё найдёт и подпишет, волшебство ёпта!
    });
});

// А потом просто пишешь в одном месте
await bus.Publish(new OrderCreatedEvent { OrderId = 123 });

И всё. Оно само улетело, обменник создался если надо, повторные попытки на случай падений, dead letter очередь прикрутится. Красота, да? Но ты, конечно, платишь за это магию — абстракцией и чуть большим оверхедом.

Так что же выбрать? Да похуй!

Шучу. Смотри:

  • RabbitMQ.Client — бери, когда задача простая как тапок, или когда надо выкрутить какую-то нестандартную хуйню на полную катушку. Или когда просто любишь контролировать каждый чих.
  • MassTransit (или, на худой конец, EasyNetQ) — бери, когда делаешь серьёзное enterprise-приложение, где этих событий и команд овердохуища. Когда нужна надёжность из коробки, тестируемость и чтобы не изобретать велосипед на ровном месте.

Вот и вся философия. Не усложняй, где не надо, но и не городи костыли, когда система уже размером с небольшой город.