Статьи

EasyNetQ: большие переломные изменения в усовершенствованной шине

EasyNetQ — мой маленький, простой в использовании клиентский API для RabbitMQ . Это было очень хорошо в последнее время. На момент написания этой статьи на NuGet было загружено 24 653 файла , что делает его самым популярным высокоуровневым API RabbitMQ.

logo_design_240

Цель EasyNetQ — максимально упростить работу с RabbitMQ. Я хотел, чтобы младшие разработчики могли использовать базовые шаблоны обмена сообщениями из коробки с помощью всего лишь нескольких строк кода, и чтобы EasyNetQ выполнил все тяжелые задачи: настройка очереди обмена связями, управление ошибками, управление подключениями, сериализация, обработка потоков; все, что делает работу с низкоуровневым API-интерфейсом AMQP C #, предоставляемым RabbitMQ, такой крутой кривой обучения.

Для достижения этой цели EasyNetQ должна быть очень самоуверенной библиотекой. Он имеет заданный способ настройки обменов, привязок и очередей на основе типа .NET ваших сообщений. Однако уже с первого выпуска многие пользователи сказали, что им понравилось управление соединениями, обработка потоков и управление ошибками, но они хотели иметь возможность настроить свою собственную топологию брокера. Чтобы поддержать это, мы представили продвинутый API, идея, бесстыдно похищенная у клиента RaenDB Айенде.

Вы получаете доступ к расширенной шине ( IAdvancedBus ) через свойство Advanced на IBus:

var advancedBus = RabbitHutch.CreateBus("host=localhost").Advanced;

Иногда что-то может показаться хорошей идеей в то время, а потом вы думаете: «WTF! С какой стати я это сделал? Это происходит со мной все время. Я подумал, что было бы здорово, если бы я создал топологию exchange-binding-queue, а затем передал ее методам publish и subscribe, которые затем внутренне объявили бы обмены и очереди и выполнили привязку. Я реализовал вкусную модель маленького посетителя в моем ITopologyVisitor. Я оптимизировал для собственного удовольствия программирования, а не простой, очевидный, легкий для понимания API.

Некоторое время назад я понял, что более простой набор объявлений в IAdvancedBus будет гораздо более очевидным и намеренным проектом. С этой целью я переработан передовой автобус , чтобы отделить объявляет от публикации и потребления. Я только что внес изменения в NuGet, а также обновил документацию по Advanced Bus . Обратите внимание, что это серьезные изменения , поэтому, пожалуйста, будьте осторожны, если вы обновляетесь до последней версии 0.12 и выше.

Вот как это работает:

Объявите очередь, обмен и привязку и используйте необработанные байты сообщения:

var advancedBus = RabbitHutch.CreateBus("host=localhost").Advanced;

var queue = advancedBus.QueueDeclare("my_queue");
var exchange = advancedBus.ExchangeDeclare("my_exchange", ExchangeType.Direct);
advancedBus.Bind(exchange, queue, "routing_key");

advancedBus.Consume(queue, (body, properties, info) => Task.Factory.StartNew(() =>
    {
        var message = Encoding.UTF8.GetString(body);
        Console.Out.WriteLine("Got message: '{0}'", message);
    }));

Обратите внимание, что я переименовал « Subscribe » в « Consume », чтобы лучше отражать базовый метод AMQP.

Объявите обмен и опубликуйте сообщение:

var advancedBus = RabbitHutch.CreateBus("host=localhost").Advanced;

var exchange = advancedBus.ExchangeDeclare("my_exchange", ExchangeType.Direct);

using (var channel = advancedBus.OpenPublishChannel())
{
    var body = Encoding.UTF8.GetBytes("Hello World!");
    channel.Publish(exchange, "routing_key", new MessageProperties(), body);
}

Вы также можете удалить обмены, очереди и привязки:

var advancedBus = RabbitHutch.CreateBus("host=localhost").Advanced;

// declare some objects
var queue = advancedBus.QueueDeclare("my_queue");
var exchange = advancedBus.ExchangeDeclare("my_exchange", ExchangeType.Direct);
var binding = advancedBus.Bind(exchange, queue, "routing_key");

// and then delete them
advancedBus.BindingDelete(binding);
advancedBus.ExchangeDelete(exchange);
advancedBus.QueueDelete(queue);

advancedBus.Dispose();

Я думаю, что эти изменения значительно улучшают API. Посмотрите на документацию для деталей.