Источник: Nuances of Programming
Как известно, Go — это язык программирования с открытым исходным кодом, позволяющий легко создавать простое, надёжное и эффективное программное обеспечение.
RabbitMQ представляет собой общедоступный программный брокер сообщений, который изначально реализовывал расширенный протокол очереди сообщений (Advanced Message Queuing Protocol). Впоследствии он был дополнен ещё и расширяемой архитектурой для поддержки протокола потоковой передачи текстовых сообщений (Streaming Text Oriented Messaging Protocol), протокола передачи телеметрии очереди сообщений (MQ Telemetry Transport) и других.
В этом руководстве мы создадим минимально необходимый клиент RabbitMQ, позволяющий другим пакетам публиковать сообщения или подписываться на сообщения, отправляемые в RabbitMQ или поступающие из него. Исходный код находится в GitHub .
Необходимые условия
- Необходимо хотя бы немного знать о модулях 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)
Что не было рассмотрено в статье:
- различные типы объявления очередей;
- использование точек обмена;
- модульные тесты.
Читайте также:
Перевод статьи Mehrdad Esmaeilpour : Creating a minimal RabbitMQ client using Go