Как правильно настроить фоновую обработку действий?

Как организовать обработку 100 загруженных картинок на сервере и предоставить пользователю возможность отслеживать статусы обработки через API? Каким образом можно организовать передачу информации о статусе обработки пользователю, например, в процессе или готово? Требуется ли использовать многопоточность или какие-то другие подходы для решения данной задачи?
  • 4 января 2024 г. 17:38
Ответы на вопрос 2
Для организации фоновой обработки действий, таких как обработка картинок на сервере, и предоставления пользователям возможности отслеживать статусы обработки через API, необходим системный подход, который включает в себя следующие шаги:

1. **Постановка задач в очередь:** Когда пользователь загружает картинки, сервер должен поместить задания по обработке каждой картинки в очередь задач. Для этого могут быть использованы системы очередей сообщений, такие как RabbitMQ, Redis, Amazon SQS или даже база данных, если нагрузка позволяет.

2. **Обработка задач в фоновом режиме:** Для фоновой обработки задач могут быть использованы различные инструменты и фреймворки в зависимости от используемых технологий и языка программирования. Например, для Python часто используют Celery, для Node.js — Bull или Kue, для PHP — Laravel Queues или Symfony Messenger.

3. **Масштабируемость:** Чтобы обработать множество картинок одновременно, нужно масштабировать систему. Это можно делать масштабированием работников (workers), которые обрабатывают задачи очереди. Масштабируемость может быть горизонтальной (добавление большего количества worker-ов) или вертикальной (увеличение ресурсов для каждого worker-а).

4. **Отслеживание статусов:** Для отслеживания статусов заданий можно использовать базу данных или кэш, где каждое задание имеет уникальный идентификатор и статус (например, "в процессе", "готово", "ошибка"). Фоновый процесс обновляет статус задания после его обработки.

5. **API для отслеживания статуса:** Предоставьте RESTful API или GraphQL API для проверки статуса обработки. Пользователь может опрашивать API, передавая идентификатор задания, чтобы узнать его текущий статус.

6. **WebSockets или Server-Sent Events (SSE):** Для более интерактивного опыта можно использовать WebSockets или SSE, чтобы сервер мог активно уведомлять клиента об изменениях статуса, не требуя от клиента постоянного опроса API.

7. **Отказоустойчивость:** Убедитесь, что в случае сбоев или ошибок система может восстановиться и продолжить обработку заданий с того места, где она остановилась.

8. **Мониторинг и алерты:** Настройте мониторинг системы для отслеживания её состояния и настройте систему алертинга, чтобы быть в курсе возможных проблем.

Пример реализации с Celery и RabbitMQ (для Python):

a. Настройте RabbitMQ как брокер сообщений.
b. Используйте Celery для создания задач и диспетчеризации их в очереди.
c. Запустите работников Celery, которые будут обрабатывать задачи.
d. Организуйте хранение состояний задач и их результатов в удобном для чтения виде (например, Redis или база данных).
e. Реализуйте API, через которое можно запросить состояние задачи по её идентификатору.
f. Добавьте оповещения клиента при
Читай про очереди задач . 
Обработчики очереди должны работать с СУБД, в которой будет храниться их состояние (не начато/в процессе/готово или сбой).

Пользователь должен периодически заходить на /api/result и видеть статусы по картинкам (в процессе\готово)
Server-Sent Event
https://habr.com/ru/articles/519982/
Похожие вопросы