Брокер сообщений | Очередь | Асинхронный обмен сообщениями | Джин | С примером
Здравствуйте, разработчики 💻💻. В серии статей, следующих за этим, я планирую продемонстрировать, как мы можем внедрить брокера сообщений в нашу внутреннюю инфраструктуру, которая позволит нам выполнять асинхронную и распределенную обработку. В этой статье я собираюсь реализовать простой рабочий процесс с использованием 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)
:эта строка удаляет сообщение из очереди, указывая на то, что оно было подтверждено.
Запуск приложения
- Запустите док-контейнер 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. Так что следите за обновлениями. Любые предложения будут весьма ценными. Удачного кодирования ☺.