Брокер сообщений | Очередь | Асинхронный обмен сообщениями | Джин | С примером

Здравствуйте, разработчики 💻💻. В серии статей, следующих за этим, я планирую продемонстрировать, как мы можем внедрить брокера сообщений в нашу внутреннюю инфраструктуру, которая позволит нам выполнять асинхронную и распределенную обработку. В этой статье я собираюсь реализовать простой рабочий процесс с использованием RabbitMQ в приложении golang, чтобы показать, насколько мощным может быть этот брокер сообщений.

Сценарий

В нашем приложении есть некоторые запросы или задачи, которые требуют очень много времени. Когда пользователь пытается выполнить эти ресурсоемкие задачи, интерфейс нашего приложения отправляет запрос серверу и ждет, пока не получит ответ. Это время ожидания может быть долгим и запутанным для пользователя, который видит скучный экран загрузки в пользовательском интерфейсе.

С введением RabbitMQ в серверную часть мы можем значительно решить эту проблему.

Обзор

  • Шаг 1: Внешняя часть нашего приложения отправляет запрос в наш Backend API Golang.
  • Шаг 2: Наш API (который также действует как RabbitMQ Producer) обрабатывает этот запрос и сохраняет его в очереди.
  • Шаг 3. Затем наш API немедленно отправляет ответное подтверждение во внешний интерфейс о том, что запрос был успешно получен. Благодаря этому интерфейсу не требуется ждать большего.
  • Шаг 3: В то же время RabbitMQ Consumer регулярно проверяет, есть ли какие-либо сообщения запроса в очереди. Как только производитель отправит сообщение запроса в очередь, потребитель получит его и обработает этот запрос.
  • Шаг 5: Теперь, когда запрос был обработан потребителем, мы можем использовать результаты запроса разными способами. Одним из способов может быть простое сохранение его в базе данных. Или мы можем отправить эти результаты обратно во внешний интерфейс через соединение WebSocket. Затем внешний интерфейс может показать эти результаты пользователю, и это здорово.

Выполнение

В этой статье мы собираемся реализовать как RabbitMQ Producer, так и Consumer в нашем Backend Golang API.

Структура папок

Настройка
Инициализировать модуль Golang с именем rabbitmq-golang

go mod init rabbitmq-golang

Установите клиентскую библиотеку Go RabbitMQ.

go get github.com/rabbitmq/amqp091-go

Использовать

Местоположение [ utils-› error.go]

Эта утилита обрабатывает ошибки.

Постоянная

Адрес [константы -> константа.go]

Этот файл содержит все константы, использованные в статье.

Настройка RabbitMQ

Местоположение [lib -> rabbitmq.go]

  • [Строка 8]: мы подключаемся к нашему серверу RabbitMQ.
  • [Строка 14]: Здесь мы создаем канал с подключенного сервера. Позже мы воспользуемся этим каналом для публикации и использования сообщения из очереди.

Настройка докера RabbitMQ

Мы собираемся настроить сервер управления rabbitMQ с помощью docker.

оболочка

Местоположение [.env]

Создание Docker

Местоположение [docker-compose.yml]

Здесь мы использовали образ rabbitmq:3-management и перенаправили два порта.

Контроллеры

Нам понадобятся два контроллера для обработки двух запросов task1 и task2.

Контроллер Task1

Расположение [контроллер -> task1Controller.go]

  • [Строка 3]: мы публикуем сообщение в очередь с именем queue-1[Строка 5] [мы создадим эту очередь позже в основной функции] с типом TASK1 [Строка 11] . Здесь мы используем обмен по умолчанию ("") [строка 4]. [мы будем использовать другие типы обмена в следующей статье для расширенного варианта использования]

Контроллер Task2

Расположение [контроллер -> task2Controller.go]

  • Здесь мы публикуем сообщение в очередь с именем queue-1[Line 5]с типом TASK2 [Line 11].

Маршрутизатор

Местоположение [роутер -> router.go]

Здесь мы используем маршрутизатор Gin.

  • [строка 6–11]: мы обрабатываем CORS.
  • [Строка 17]: обрабатывает запрос /task1 к task1Controller [мы создали ранее]
  • [Строка 18]: обрабатывает запрос /task2 к task2Controller [мы создали ранее]

Главная

Адрес [main.go]

  • [Строка 3]: мы получаем соединение и канал rabbitMQ из файла конфигурации, который мы создали ранее. [lib -> rabbitmq.go]
  • [Строки 7–14]: мы создаем очередь с именем queue1 [название, указанное в строке 8].
  • [Строки 18–26]: мы настраиваем потребителя, который прослушивает очередь с именем queue1, упомянутую в строке 19.
  • [Строка 30–40]: Здесь мы прослушиваем любые новые сообщения из очереди. Как только мы получаем какое-либо сообщение, мы проверяем тип сообщения и обрабатываем его соответствующим образом.

d.Ack(false):эта строка удаляет сообщение из очереди, указывая на то, что оно было подтверждено.

Запуск приложения

  1. Запустите док-контейнер RabbitMQ
docker-compose up -d

2. Запустите наш Backend API

go run main.go

Внутренний API [ http://localhost:8000/]

Управление RabbitMQ [ http://localhost:9000/]

Внутри раздела очередей [http://localhost:9000/#/queues]

Мы видим, что queue-1[имя, которое мы использовали для создания очереди в нашем коде], было создано.

ТЕСТ

Отправьте запрос POST для выполнения задачи 1.

curl -X POST localhost:8000/task1

Ответ внешнему интерфейсу

Внешний интерфейс получает мгновенный ответ о том, что запрос Task1 был успешно получен. Теперь нам не требуется загрузка пользовательского интерфейса.

Консоль API

Мы видим логи от RabbitMQ Consumer[Golang API]. Это показывает, что сообщение запроса было получено потребителем из очереди.

ЗАКЛЮЧЕНИЕ

Если вы заблудились в какой-либо части, вы можете проверить мой проект Github.



Это конец нашего короткого пути по реализации RabbitMQ в приложении golang. Надеюсь, это поможет вам в вашем проекте. В ближайшие дни я создам больше статей, показывающих более продвинутые варианты использования RabbitMQ. Так что следите за обновлениями. Любые предложения будут весьма ценными. Удачного кодирования ☺.