Найти тему
Nuances of programming

Создание простого клиента RabbitMQ с помощью Go

Оглавление

Источник: Nuances of Programming

Как известно, Go  —  это язык программирования с открытым исходным кодом, позволяющий легко создавать простое, надёжное и эффективное программное обеспечение.

RabbitMQ представляет собой общедоступный программный брокер сообщений, который изначально реализовывал расширенный протокол очереди сообщений (Advanced Message Queuing Protocol). Впоследствии он был дополнен ещё и расширяемой архитектурой для поддержки протокола потоковой передачи текстовых сообщений (Streaming Text Oriented Messaging Protocol), протокола передачи телеметрии очереди сообщений (MQ Telemetry Transport) и других.

В этом руководстве мы создадим минимально необходимый клиент RabbitMQ, позволяющий другим пакетам публиковать сообщения или подписываться на сообщения, отправляемые в RabbitMQ или поступающие из него. Исходный код находится в GitHub .

Необходимые условия

  • Предполагается, что Go у вас уже установлен. Если нет, загляните сюда .
  • Необходимо хотя бы немного знать о модулях Go . Они понадобятся в качестве решения для управления зависимостями.
  • Нужно иметь общее представление о том, как работает RabbitMQ. Все аспекты и типы приёма и отправки сообщений подробно рассматриваться не будут.

Первые шаги

Сначала нужно создать каталог с именем модуля. Назовём его rmq . Затем инициализируем модули Go с помощью команды go mod init . Теперь нужно получить основную зависимость. Для этого задействуем команду go get github.com/streadway/amqp. .

Затем в корневом каталоге модуля создаём файл main.go . С этого файла всё начнётся (и, возможно, в нём закончится). Основной файл должен быть таким:

package rmq

Теперь создадим пользовательский тип RabbitClient и добавим в этом клиенте отдельно каналы подписчика и издателя, а также соединение.

Подключение и создание каналов

В этой части добавим два закрытых метода для пользовательского типа, который пытается подключиться к RabbitMQ, а затем создаёт канал на основе типа соединения (подписчик|издатель), и подключаемся повторно (если он уже существует).

Метод connect получает два аргумента с булевым значением, позволяя узнать о типе соединения и режиме повторного подключения. Предполагается, что у вас уже есть информация о сервисе RabbitMQ (имя пользователя, пароль, хост и порт) в пользовательском типе config .

Как и connect , метод channel получает два аргумента с булевым значением, позволяя узнать о типе соединения и режиме повторного подключения. Этот метод пытается навсегда подключиться к сервису RabbitMQ, а затем создать канал на основе типа соединения.

Теперь, когда есть возможность подключаться и создавать каналы, начнём публиковать сообщения и подписываться на них. Объявим ленивые очереди. Это постоянные очереди, которые сохраняют своё состояние и восстанавливаются после перезапуска сервера/брокера как в режиме подписки, так и в режиме публикации. Здесь можно вносить изменения в соответствии с конкретной задачей.

Подпишемся на что-нибудь

Метод Consume получает два аргумента. Один  —  это имя очереди, а другой  —  функция, обрабатывающая тело получаемого сообщения. В зависимости от результата этой функции переходим к ack|nack (подтверждение|отрицательное подтверждение).

Метод Consume обрабатывает NotifyClose , NotifyBlocked и NotifyClose из соединения и канала и пытается повторно подключиться или воссоздать их при необходимости.

Опубликуем что-нибудь

Метод Publish получает три аргумента, один из которых  —  имя очереди, а другой  —  байтовый массив, и содержит тело сообщения.

Этот метод выполняет повторное подключение или при необходимости воссоздание канала.

Использование

Создаём экземпляр типа RabbitClient и используем метод Consume или метод Publish .

var rc rmq.RabbitClient

rc.Consume("test-queue" , funcName)

rc.Publish("test-queue" , mBody)

Что не было рассмотрено в статье:

  • различные типы объявления очередей;
  • использование точек обмена;
  • модульные тесты.

Читайте также:

Читайте нас в Telegram , VK

Перевод статьи Mehrdad Esmaeilpour : Creating a minimal RabbitMQ client using Go