@log95

Какую выбрать архитектуру для распределённой системы по обработке изображения (docker, микросервисы)?

Есть веб-приложение. У него есть потребность по изображению получить некие данные. В формировании данных участвуют три сервиса.

5cd1d8e7ce49e987941988.jpeg

Изображение подаётся на вход Service1. Он возвращает данные, которые подаются на вход Service2. Результат Service2 подаётся на вход Service3. И результат Service3 отдаётся клиенту.
Так как сервисы весьма разрозненные со своим окружением, то решено было выделить их в отдельные контейнеры.
Вопрос - как правильно организовать передачу данных в таком случае?

Как я понимаю, нужен какой-то контроллер, как указал на изображении, который будет передавать данные между сервисами и возвращать результат в основное приложение.
Все узлы (приложение, контроллер, сервисы) вынести в контейнеры.
Передачу данных между всеми узлами выполнять через HTTP-запросы (в частности, изображение передавать через base64).
Так как кол-во нод любого сервиса может быть разное количество, то получается нужен ещё балансировщик для контроллера, который будет помогать определять случайную ноду сервиса.
Вышеописанное - построение "велосипеда" и есть какие-то стандартные техники?
Или же есть статья, описывающая подобное (передача данных, контроллер для сервисов)?
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
Исходя из
этого
Не знаю, насколько вам интересно будет погружаться в саму бизнес-логику. Вкратце она такая:
- Service1 делает обработку изображения. OpenCV + python скорее всего (нахождение контуров, вырезка и прочее). На выходе будет порядка 3-9 изображений
- Service2 делает распознавание. Тут или tesseract или нейронная сеть. На выходе несколько текстов.
- Service3 делает обработку нескольких текстов и выдаёт результирующий текст. Скорее всего тут будут python-библиотеки.
уточнения, вижу архитектуру такой:
Поскольку сервисы взаимосвязаны между собой так, что их нужно вызывать поочередно, то логично связать обработку данных при помощи очереди сообщений:
Изображение (ID=123) -> Очередь Нарезка Изображений (OpenCV) -> каждое полученное нарезанное изображение кладём в Очередь OCR -> распознанный текст кладём в Очередь Анализ Текста.

Для обработки изображения в Очереди Нарезка Изображений кладем его по некоторому пути (им может быть путь в AWS S3) и воркер этой очереди с инстанса некоторой ВМ обращается по заданному пути и результаты работы сохраняет по заданному пути для обработанных изображений и каждое из них в отдельности (путь и ID изображения) кладёт в Очередь OCR.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Асинхроно, через Service Bus на Kafka.
<:o)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы