Как справиться с высоким временем отклика

Есть два разных сервиса. Один сервис -Django получает запрос от внешнего интерфейса, а затем вызывает API в другом сервисе -Flask.

Но время ответа службы Flask велико, и если пользователь перейдет на другую страницу, запрос будет отменен.

Должна ли это быть фоновая задача или шаблон pub/sub? Если да, то как сделать это в фоновом режиме и затем сообщить пользователю, что вот ваш последний результат?

У вас есть два основных возможных варианта:

  • Сделайте начальный запрос к "простому" представлению Django, которое загрузит скелетную HTML-страницу со спиннером, где некоторые JS вызовут XHR-запрос ко второму представлению Django, которое будет содержать вызов другого сервиса (Flask). Таким образом, вы можете даже правильно предупредить пользователя о том, что загрузка занимает некоторое время, и обработать выход на стороне браузера (запросить подтверждение перед выходом/прервать запрос...)

    .
  • По возможности кэшируйте результат работы сервиса Flask, чтобы не вызывать его при каждой загрузке страницы.

Вы можете объединить эти два решения, вызывая сервис асинхронным запросом и кэшируя его результат (в зависимости от контекста, вам может потребоваться настройка кэша в зависимости от подключенного пользователя, например). Первое решение может быть отклонено с помощью pub/sub, websockets, чего угодно, но классический XHR кажется подходящим для вашего случая.

В нашем проекте есть несколько конечных точек, требующих больших затрат времени. Наше решение было похоже на предыдущий ответ: Получив запрос, мы вызываем задачу Celery, которая выполняет свою дорогостоящую работу в режиме async. Мы не ждем ее результатов и возвращаем пользователю быстрый ответ. Задача Celery отправляет свой прогресс/результаты через WebSockets пользователю. Фронтенд обрабатывает это WS-сообщение. Преимущество этого подхода в том, что мы не тратим CPU нашего бэкенда. Мы используем процессор рабочего Celery, который работает на другой машине.

Вернуться на верх