EasyNetQ — мой маленький, простой в использовании клиентский API для RabbitMQ . Это было очень хорошо в последнее время. На момент написания этой статьи на NuGet было загружено 24 653 файла , что делает его самым популярным высокоуровневым API RabbitMQ.
Цель 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. Посмотрите на документацию для деталей.