Система подготовки многокомпонентных отчетов

Принцип работы системы

  • Пользователь запрашивает сложный составной отчет (например, отчет по истории подержанного автомобиля от Автотеки).
  • Отчет состоит из набора разных блоков данных, каждый из которых представляет собой отдельный мини-отчет (например, список владельцев ТС, история ДТП и т.д.).
  • Каждый компонент отчета в виде задания отправляется в соответствующую очередь (у каждого типа компонента своя очередь).
  • Специальные обработчики слушают эти очереди и разбирают из них задания для выполнения.
  • После выполнения заданий обработчики отправляют результаты в общую результирующую очередь.
  • После сбора всех составных частей (из результирующей очереди) итоговый отчет показывается клиенту в веб-интерфейсе.

Основные компоненты системы

Веб-сервис (Golang)

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

Шина сообщений (RabbitMQ)

Служит транспортной системой для передачи заданий/результатов между другими компонентами системы.

Специальные обработчики (Golang)

Занимаются обработкой заданий в соответствии с заложенной в них бизнес-логикой.

Пример отчета "История подержанного автомобиля"

Блоки отчета (типы заданий)

  • История и сроки владения (сколько было владельцев)
  • Участие в ДТП (в скольких ДТП участвовало данное ТС)
  • Наличие ограничений или сведений о розыске

Состав очередей в RabbitMQ

  • reports.used-car.accidents (для заданий типа "Участие в ДТП")
  • reports.used-car.limits-wanted-info (для заданий типа "Наличие ограничений или сведений о розыске")
  • reports.used-car.ownership-history (для заданий типа "История и сроки владения")
  • reports.used-car.results (в эту очередь попадают результаты по всем блокам отчета)
  • reports.unrouted (в эту очередь попадают все сообщения, не прошедшие маршрутизацию)

Механика работы веб-сервиса

  • Принимает запрос от пользователя на формирование отчета.
  • Формирует и отправляет задание на формирование отчета в обменник "reports.tasks" (в качестве ключа маршрутизации указывается "reports.used-car").
  • Получает все сообщения из очереди "reports.used-car.results".
  • При получении частей отчетов актуализируется их статус в общем списке отчетов.
  • Использует выделенного пользователя "report-used-car-webserver" для работы с RabbitMQ. Может лишь отправлять сообщения с ключем "reports.used-car" в обменник "reports.tasks", а также читать сообщения из очереди "reports.used-car.results".

Механика работы обработчиков

  • Принимают задания из очередей "reports.used-car.*" (каждый обработчик слушает свою очередь).
  • Выполняют необходимую бизнес-логику для построения данных блоков отчета.
  • Отправляют результаты своей работы в виде сообщений в обменник "reports.results" (в качестве ключа маршрутизации указывается "reports.used-car").
  • Используют выделенного пользователя "report-used-car-subreport" для работы с RabbitMQ. Могут лишь отправлять сообщения с ключем "reports.used-car" в обменник "reports.results", а также читать сообщения из всех очередей "reports.used-car.*".

Запуск демонстрации

$ docker-compose up -d
  • Веб-интерфейс системы будет доступен по адресу: http://localhost:8080/
  • Веб-интерфейс RabbitMQ будет доступен по адресу: http://localhost:15672/ (guest/guest)

Проверить работу системы можно по следующему набору VIN-номеров:

  • 123456
  • 234567
  • 345678
  • fake-vin
Шаг 1
Шаг 2
Шаг 3