@startuml Crowd Node - Request Processing Flow !define COMPONENT_BG_COLOR #E3F2FD !define API_BG_COLOR #FFF3E0 !define STORAGE_BG_COLOR #F3E5F5 participant "tasks.py" as TaskListener COMPONENT_BG_COLOR participant "analyzer.py" as Analyzer COMPONENT_BG_COLOR participant "PersonDetector" as PersonDetector participant "PersonDetectionService" as PersonDetectionService participant "Redis Queue" as RedisQueue #FFCCCC participant "S3 Storage" as S3 STORAGE_BG_COLOR participant "Central" as Central API_BG_COLOR == Вариант 1: Получаем задачу в analyze, процессим синхронно и отдаем ответ == TaskListener -> Analyzer : Получена задача на процессинг Analyzer -> PersonDetector : Отправка задачи на анализ PersonDetector -> PersonDetectionService : Установка HTTP соединения group Открытое HTTP соединение PersonDetector -> PersonDetectionService : HTTP POST запрос PersonDetectionService -> PersonDetectionService : Обарботка запроса PersonDetectionService --> PersonDetector : Отправка в response результата end group PersonDetector --> Analyzer : Результаты задачи == Вариант 2: Получаем задачу в analyze, кладем в очередь, процессим в очереди, формируем результат и отдаем в ответе analyze == TaskListener -> Analyzer : Получена задача на процессинг Analyzer -> RedisQueue : Положили в очередь задачу на анализ изображения group Polling PersonDetector -> RedisQueue : полит очередь на предмет наличия задач RedisQueue --> PersonDetector : Получает задачу на анализ group Асинхронный запрос на анализ PersonDetector -> PersonDetectionService : Дерганье API сервиса для анализа PersonDetectionService -> PersonDetectionService : Обарботка запроса PersonDetectionService --> PersonDetector : Отправка в response результата end group end group group Polling Analyzer -> RedisQueue : Полит в ожидании выполненных задач RedisQueue --> Analyzer : Выполненные задачи анализа end group == Вариант 3: Получаем задачу в analyze, процессим синхронно, формируем результат, отдаем в ответе get_results == note over PersonDetector Такое ощущение что это похоже не вариант 1 end note == Вариант 4: Получаем задачу в analyze кладем в очередь, процессим в очереди, формируем результат и отдаем в ответе get_results == TaskListener -> Analyzer : Получена задача на процессинг activate Analyzer Analyzer -> PersonDetector : Отправка задачи на анализ\nво внутреннюю очередь PersonDetector'a group Внутрянка PersonDetector'a PersonDetector -> PersonDetector: как то хэндлит запросы на обработку group Обработка в порядке очереди PersonDetector -> PersonDetectionService : отправляет HTTP запросы на обработку\nпо внутренней логике PersonDetectionService --> PersonDetector PersonDetector --> Analyzer : Результат задачи на обработку deactivate Analyzer end group end group @enduml