Как получить обновления (ответ) от REST API, реализованного с помощью Flask? Есть ли обходной путь, если это невозможно? - PullRequest
0 голосов
/ 23 октября 2019

Я работаю над приложением OCR. Я использую докер для своего приложения. Приложение состоит из 4 контейнеров.

  1. Конвертор (преобразует PDF в изображение)
  2. Очиститель (Очищает изображение)
  3. Транскрибер (Преобразует изображение в текст)
  4. Все вОдин

Контейнер AllinOne объединяет все остальные контейнеры через вызовы API. API реализованы с использованием Flask. Контейнер AllinOne доступен для сервера. Рабочий процесс выглядит следующим образом: Почтальон (Запрос пользователя) -> AllinOne -> Конвертор -> AllinOne -> Очиститель -> Allinone -> Транскрибер -> Allinone -> Почтальон (ответ)

Теперь я пытаюсьдобавить функцию в мое приложение под названием Массовая загрузка, где пользователи смогут загружать ZIP-файл. Поскольку массовая загрузка файлов занимает больше времени, мне нужны промежуточные результаты о состоянии процесса. У меня есть file_id, выделенный для каждого загружаемого файла. Мне нужно вернуть file_id пользователю, чтобы он мог проверить состояние обработки своего файла. Но обработка должна происходить в фоновом режиме.

Если я верну file_id, обработка остановится, иначе file_id будет возвращен только после обработки файла, что бесполезно. Должен ли я реализовать два вызова API? Один для загрузки файла и возврата file_id, а другой для обработки файла и возврата результата. Есть ли способ отправлять частые обновления в ответ от API? Можно ли сделать это лучше? Не стесняйтесь предлагать любые изменения в архитектуре.

Заранее спасибо, Кришна Прасад AS

1 Ответ

0 голосов
/ 23 октября 2019

REST-API является синхронным, но ваша обработка не обязательна. Вам, вероятно, следует изменить свою архитектуру, чтобы ваш HTTP-POST просто создавал все необходимые задания и возвращал идентификаторы, которые пользователь может проверить позже.

Когда пользователь хочет получить обновление, он должен запросить ваш API, используяid для получения статуса.

Очевидно, что все ваши контейнеры должны поддерживать этот шаблон - например, они отправляют асинхронные обновления о состоянии обработки. По моему опыту, вызовы rest api - не лучший шаблон для этого, используйте что-то асинхронное для сообщения о состоянии, например RabbitMq / kafka / nats. Контейнер All in One / новый выделенный агрегатор может затем агрегировать такие обновления и возвращать статус, если кто-то спросит.

...