Лучший способ создать REST API для длительных задач? - PullRequest
10 голосов
/ 06 сентября 2010

Предположим, у меня есть 2 сервера.

Первый - это сервис, который предоставляет некоторые вычисления, которые могут длиться долго (от минут до часов).

Второй сервер будет использовать эту службу для вычисления некоторых данных.

Я пытаюсь разработать REST API для первого сервера, и пока все хорошо. Но я хотел бы услышать мнение о том, как смоделировать уведомления, когда долгое задание завершено.

Я рассмотрел 2 подхода:

  1. Опрос - второй сервер время от времени спрашивает о результате.
  2. Callback - Второй сервер настроит URI для первого, который будет вызываться после того, как это будет сделано. Но это немного пахнет в REST API.

Что вы думаете?

Ответы [ 3 ]

7 голосов
/ 07 сентября 2010

Для вашей ситуации я бы выбрал опрос. Когда второй сервер делает первоначальный запрос на создание задания на первом сервере, он должен получить ответ с URL-адресом возможной страницы состояния. Затем второй сервер опрашивает этот URL каждые 5-15 минут, чтобы проверить состояние задания. Если первый сервер создает этот URL-канал в формате RSS или Atom, пользователи также могут указать своим читателям RSS на тот же URL-адрес и узнать, выполнено ли задание. Это настоящая победа, когда и люди, и машины могут получать информацию из одного источника.

4 голосов
/ 06 сентября 2010

В дополнение к тому, на что я уже ответил в на этот похожий вопрос , я бы предложил использовать протокол публикации Atom для уведомления (вы можете опубликовать его на своем втором сервере) .

1 голос
/ 06 сентября 2010

Если вы используете Python, вы можете использовать RabbitMQ и Celery для выполнения этой работы.Celery позволяет вам создать элемент в очереди, а затем приостановить выполнение всего, через что вы его запускаете (например, Django), так что вы можете использовать выход процессора очереди, когда он станет доступным.Нет необходимости опрашивать ИЛИ обратные вызовы.

...