Статьи

Easy RabbitMQ Обмен сообщениями с EasyNetQ

Эта статья о EasyNetQ, библиотеке для использования RabbitMQ с .NET. На момент написания этой статьи EasyNetQ все еще была предварительной версией программного обеспечения . Несмотря на это, несколько человек использовали его в производственной среде некоторое время. Если вы используете его в производстве, это на ваш страх и риск.

В августе прошлого года я написал « Начало работы с RabbitMQ с .NET» . Это, помимо прочего, показало, как вы можете получать сообщения из очереди RabbitMQ с помощью официальной клиентской библиотеки RabbitMQ .NET.

Хотя это и прекрасно, но часто предпочтительнее использовать библиотеку более высокого уровня, которая заботится о мелких деталях и позволяет вам сосредоточиться на реальном обмене сообщениями в структурированном виде. Ну, вот почему EasyNetQ существует . С EasyNetQ вам не нужно беспокоиться о таких вещах, как сериализация, шаблоны обмена сообщениями, надежность соединения и т. Д. В оставшейся части этой статьи мы увидим, как легко отправлять и получать сообщения с помощью EasyNetQ.

Конечно, первое, что нам нужно сделать, это установить пакет EasyNetQ NuGet:

easynetq-установки-пакет

Затем давайте создадим класс, который представляет сообщения, которые мы будем отправлять. В этом примере мы представим, что отправляем позицию игрока в игре:

    public class PlayerPosition
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

Получив это, мы можем подписаться на сообщения, поступающие в очередь. Это сделано так:

            using (var bus = RabbitHutch.CreateBus("host=localhost"))
            {
                bus.Subscribe<PlayerPosition>("MyGame", playerPosition =>
                    Console.WriteLine($"{playerPosition.X}, {playerPosition.Y}"));

                Console.ReadLine();
            }

Итак, вы объявляете свою очередь, используя RabbitHutch.CreateBus(). Автобус это просто очередь. Так что же RabbitHutch? Ну что я могу сказать? Это клетка для кроликов .

Facepalmorangflipped

Обратите внимание, как мы подписываемся специально, чтобы получать сообщения типа PlayerPosition. Мы используем идентификатор подписки «MyGame», и мы также передаем обработчик, который указывает, что делать с полученным сообщением. Если синтаксис выглядит немного незнакомым, это потому, что я использую интерполяцию строк , новую функцию языка C #, представленную в C # 6.0.

Когда мы запустим это, мы увидим, что создана очередь с именем, созданным из имени класса сообщения и subscriptionId:

easynetq-newqueue

Теперь, чтобы понять, что происходит в очереди, давайте пока остановим подписчика.

Мы можем отправить сообщение в очередь следующим образом:

            using (var bus = RabbitHutch.CreateBus("host=localhost"))
            {
                var playerPosition = new PlayerPosition() { X = 1, Y = 2 };
                bus.Publish<PlayerPosition>(playerPosition);

                Console.ReadLine();
            }

Обратите внимание, как мы отправляем строго типизированный объект (в отличие от свободной строки), который мы предоставляем в качестве универсального параметра. Конечно, вы можете не указывать общий параметр, но я включил его выше для ясности.

Теперь мы можем проверить сообщение в очереди из раздела «Получить сообщения» в веб-интерфейсе управления RabbitMQ:

easynetq-сообщение-пример

Как видите, отправленные нами данные сериализуются в JSON, а также сопровождаются информацией о типах, которая помогает EasyNetQ десериализовать их на принимающей стороне.

Фактически, теперь мы можем снова запустить нашего подписчика и увидеть, что он потребляет сообщение:

easynetq-сообщение получил

Таким образом, вы можете увидеть, как EasyNetQ позволяет легко сосредоточиться на обмене сообщениями и оставить все детали. Естественно, с EasyNetQ вы можете сделать гораздо больше, чем показано в этой вводной статье. Проверьте документацию EasyNetQ для получения дополнительной информации.