Получение результата длительной задачи с RabbitMQ - PullRequest
5 голосов
/ 03 мая 2011

У меня есть сценарий, когда клиент отправляет http-запрос на скачивание файла.Файл должен быть сгенерирован динамически и обычно занимает 5-15 секунд.Поэтому я ищу решение, которое разделяет эту операцию на 3 http-запроса.

  1. Первый запрос запускает генерацию файла.
  2. Клиент опрашивает сервер каждые 5 секунд, чтобы проверить, готов ли файл к загрузке
  3. Когда ответ на запрос опроса положительный, клиент начинает скачивать файл

Для реализации этого я ищу решения очереди сообщений, такие как RabbitMQ.Похоже, они обеспечивают надежную среду для асинхронного выполнения длительных задач.Однако после прочтения учебников на RabbitMQ я не уверен, как я получу результат операции.

Вот что я имею в виду:

Aсервер переднего плана получает запросы от клиентов и при необходимости отправляет сообщения в RabbitMQ.Этот сервер переднего плана будет иметь 3 конечных точки

/generate
/poll
/download

Когда клиент вызывает /generate с параметром GET скажем request_uid=AAA, сервер переднего плана отправит сообщение в RabbitMQ с request_uid в полезной нагрузке,Любой свободный работник впоследствии получит это сообщение и начнет генерировать файл, соответствующий AAA.

Клиент будет продолжать опрашивать /poll с request_uid=AAA, чтобы проверить, была ли задача выполнена.

Когдазадача выполнена, клиент будет звонить /download с request_uid=AAA, ожидающим загрузки файла.

Вопрос в том, как обработчики /poll и /download сервера переднего плана узнают о состоянии задания создания файла?Как RabbitMQ может сообщить результат задачи обратно производителю.Или я должен реализовать такой механизм за пределами RabbitMQ?(Потребитель помещает свои результаты в файл /var/completed/AAA)

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Самый простой способ начать работу с AMQP - это использовать обмен темами и создавать очереди, содержащие сообщения управления. Например, вы можете иметь очередь file.ready и отправлять сообщения с путем к файлу, когда он будет готов к отправке, и очередь file.error для отчета, когда по какой-то причине вам не удалось создать файл. Затем клиент может использовать очередь file.generate для отправки информации GET на сервер.

1 голос
/ 04 мая 2011

Вы ударили гвоздь по голове своей последней строкой:

(потребитель помещает свои результаты в файл / var / complete / AAA)

Ваш сервер должен координировать несколько заданий и результаты их работы. Поэтому вам понадобится некая форма «главного репозитория», которая содержит авторитетную запись того, что уже закончено. Копирование готовых файлов в специальный каталог - это разумный и простой способ сделать это.

Для этого не обязательно нужен RabbitMQ или какое-либо решение для обмена сообщениями. Ваш сервер может отправлять задания этим работникам любым способом: порождать процессы, использовать пул потоков или даже создавать события AMQP, которые в конечном итоге оказываются посредником и поглощаются потребителями очереди «работника». Это зависит от вашего приложения и того, что для него наиболее подходит.

...