Про RabbitMQ для QA. 2024

RabbitMQ — это мощная система брокера сообщений, широко используемая для асинхронного обмена данными между различными приложениями или микросервисами. В этой статье мы разберем структуру RabbitMQ, его основные компоненты, процесс взаимодействия, и почему его предпочитают использовать вместо простого REST API. Также рассмотрим, где хранятся очереди, как читать логи, и как работают производители и потребители.

Пример схемы работы с RabbitMQ
Пример схемы работы с RabbitMQ

Поставь лайк статье и подпишись❤

Основные компоненты RabbitMQ.

  • Producer (Производитель): Приложение или процесс, который отправляет сообщения в RabbitMQ.
  • Exchange (Обменник): Получает сообщения от производителей и направляет их в очереди на основе правил маршрутизации.
  • Queue (Очередь): Место хранения сообщений до тех пор, пока их не заберет потребитель.
  • Consumer (Потребитель): Приложение или процесс, который получает сообщения из очереди и обрабатывает их.

Взаимодействие с RabbitMQ: Пошаговый процесс

1. Запрос от внешнего источника

Представьте, что у вас есть веб-приложение для обработки заказов. Когда пользователь размещает заказ через веб-интерфейс, сервер принимает этот запрос и формирует сообщение с информацией о заказе.

Пример запроса от клиента (HTTP POST):

plaintext POST /placeOrder { "customerId": 123, "items": [ {"productId": 1, "quantity": 2}, {"productId": 2, "quantity": 1} ] }

2. Отправка сообщения в RabbitMQ (Производитель)

Веб-сервер подключается к RabbitMQ и отправляет сообщение в обменник. Обменник маршрутизирует это сообщение в соответствующую очередь.

Сообщение в RabbitMQ:

plaintext Exchange: order_exchange Routing Key: order.created Сообщение: { "orderId": 456, "customerId": 123, "items": [{"productId": 1, "quantity": 2}, {"productId": 2, "quantity": 1}] }

3. Маршрутизация сообщения (Обменник)

Обменник получает сообщение от производителя и направляет его в одну или несколько очередей на основе ключа маршрутизации.

Пример маршрутизации:

  • Exchange (Обменник): `order_exchange`
  • Routing Key (Ключ маршрутизации): `order.created`

4. Получение и обработка сообщения (Потребитель)

Потребитель получает сообщение из очереди и выполняет необходимые действия, такие как обновление базы данных и взаимодействие с внешними API.

Пример обработанного сообщения:

plaintext Сообщение из очереди: { "orderId": 456, "customerId": 123, "items": [{"productId": 1, "quantity": 2}, {"productId": 2, "quantity": 1}] } Действия: Обновление базы данных, вызов платежного API

5. Обновление интерфейса клиента

После успешной обработки заказа потребитель RabbitMQ отправляет уведомление на клиентский интерфейс через WebSocket или HTTP, чтобы обновить отображаемую информацию (например, статус заказа).

Пример ответа клиенту через WebSocket:

plaintext WebSocket Message: { "orderId": 456, "status": "Processed" }

Почему RabbitMQ вместо REST API?

  • Асинхронность: REST API работает синхронно, что может блокировать ресурсы. RabbitMQ позволяет отправлять сообщения асинхронно, повышая производительность.
  • Надежность: RabbitMQ обеспечивает гарантированную доставку сообщений и их хранение до успешной обработки.
  • Масштабируемость: RabbitMQ легко масштабируется, поддерживая тысячи очередей и сообщений в секунду.
  • Устойчивость к сбоям: RabbitMQ поддерживает кластеризацию и высокую доступность, обеспечивая устойчивость системы.

Где хранятся очереди?

Очереди в RabbitMQ могут храниться как в оперативной памяти, так и на диске:

  • Transient (Временные) очереди: Хранятся только в памяти.
  • Durable (Устойчивые) очереди: Сохраняются на диске и восстанавливаются после перезапуска сервера.

Как читать логи?

Логи RabbitMQ можно найти в директории `/var/log/rabbitmq/` (для Linux) или аналогичных директориях для других операционных систем. Также можно использовать RabbitMQ Management Plugin для просмотра логов через веб-интерфейс.

bash tail -f /var/log/rabbitmq/rabbit@yourhostname.log

Производители и потребители

  • Производители (Producers): Отправляют сообщения в RabbitMQ. Производитель подключается к RabbitMQ и отправляет сообщение в обменник.
  • Потребители (Consumers): Получают сообщения из очередей и обрабатывают их. Потребитель подключается к очереди и извлекает сообщение для обработки.

Управление памятью

RabbitMQ использует память для хранения сообщений. При переполнении памяти сообщения могут быть выгружены на диск. Для управления памятью используются настройки лимитов и политики, такие как `vm_memory_high_watermark`.

Вчитывание из очередей

Потребители читают сообщения из очередей с помощью следующих методов:

  • Basic Get: Синхронное получение сообщения.
  • Basic Consume: Асинхронная подписка на очередь.

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

Пример тестирования.

Позитивный тест.

Отправляем корректное сообщение заказа через интерфейс клиента в RabbitMQ, проверяем, что оно успешно попало в очередь и было обработано потребителем, обновившим статус заказа в клиентском интерфейсе.

Негативный тест.

Отправляем сообщение с неверным форматом данных специально через интерфейс RabbitMQ и проверяем, что система корректно обрабатывает ошибку, записывая соответствующую запись в логах и не обновляя базу данных.

Заключение

RabbitMQ — это мощный инструмент для асинхронного обмена сообщениями между приложениями. Он используется для повышения производительности и надежности систем, обеспечивая масштабируемость и устойчивость к сбоям. Понимание того, как производители и потребители взаимодействуют с очередями и обменниками, как управлять памятью и читать логи, является ключевым для эффективного использования RabbitMQ. Если говорить очень коротко про RabbitMQ, то он выступает в роли посредника, который принимает сообщения от одного источника (производителя) и перенаправляет их к нужному потребителю.

Подпишись на канал для будущих тестировщиков: ссылка жми

Василий Волгин - QAA с опытом более 3 лет.<br />
Василий Волгин - QAA с опытом более 3 лет.
Начать дискуссию