2010-09-06 2 views
9

Предположим, у меня есть 2 сервера.Лучший способ создания REST API для выполнения длительных задач?

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

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

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

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

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

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

ответ

4

В дополнение к тому, что у меня есть already answered в this similar question, я бы предложил использовать протокол публикации Atom для уведомления (вы можете опубликовать его на своем втором сервере).

+0

Неправильно ли было бы использовать обратный подход? У меня очень похожая проблема (за исключением того, что моя служба может взять что-нибудь от 2 до 500 секунд, чтобы ответить), а использование обратного вызова кажется намного проще, чем опрос – Johan

+0

. Краткое объяснение и ссылка на объяснение протокола публикации Atom значительно улучшат этот ответ , – Geerten

1

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

+0

Если вы не понимаете сельдерей (т. Е. Вы являетесь автором), я просто использую Rabbit MQ + pika напрямую и сберегаю себя от боли (исчезающие исключения, цепочка просто не работает, странные проблемы совместимости с gevent и т. Д.). Вы можете заставить его работать, но если вы делаете что-то отдаленно сложное, сельдерей скрывает вас от множества реальных деталей выполнения работ, которые вам могут понадобиться. – pip

7

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

Смежные вопросы