2014-02-19 1 views
0

Я реализую веб-сервис с использованием Azure Cloud Services. Веб-сервис должен ...Наиболее масштабируемые средства для возврата результатов клиенту из роли рабочего Azure

  • принимает входные данные
  • запустить потенциально громоздкое вычисление на входных данных
  • результатов возвращаемых расчета

Из того, что я прочитал, рекомендуется, чтобы рабочая роль принимала вычисления, в то время как веб-роль обрабатывает HTTP-запросы/ответы, а очередь используется для передачи входных данных между двумя типами роли. Эта архитектура позволяет масштабировать веб-роли, чтобы удовлетворить повышенный спрос на веб-трафик и/или рабочие роли, которые необходимо масштабировать, чтобы обеспечить параллельную обработку результатов.

Я не уверен, что это лучший способ доставить полученные результаты обратно клиенту, который отправил исходный HTTP-запрос в веб-роль. Что касается масштабируемости, лучше ли предоставить дополнительный метод веб-службы, который клиенты могут вызывать для возврата результатов (если они были обработаны) или лучше вернуть результаты как часть ответа HTTP на исходный запрос?

Если последнее, что является самым простым способом сделать это с помощью PHP?

Любой совет будет очень благодарен.

ответ

2

Вот понятие можно заимствовать из API Azure в: http://msdn.microsoft.com/en-us/library/windowsazure/ee460783.aspx

  1. Client делает запрос на web role для вычислений.
  2. Web role создает GUID для этой операции.
  3. Web role добавить запросы в Azure Storage Queue & Service Bus, добавляет GUID к записи в очереди.
  4. Web role отвечает на вопросы клиента HTTP 201 Accepted и GUID как OperationId в корпусе ответа.
  5. Клиент проверяет конечную точку API на web role, чтобы узнать, завершена ли операция с этим идентификатором.
  6. Web role запрашивает некоторое хранилище таблиц (db или Azure Table), чтобы увидеть, что эта запись операции отмечена как завершенная.
  7. Между тем worker role pickes до операции из очереди, обрабатывает его и когда сделано, помещает результат обратно в хранилище таблицы (или БД), поэтому веб-роль может получить доступ с помощью OperationID
  8. Между тем client был опрашивает API с GetOperationStatus (operationId) звоните каждые 1 минуту или около того. Когда задача завершена и результаты готовы, клиент может вызвать if GetOperationStatus(operationId) == finished { GetOperationResults(operationId) } через конечную точку API по адресу web role.

Здесь клиент никогда не связывался с рабочей ролью напрямую. Поскольку рабочие роли должны выполнять фоновые операции. И это делается посредством обмена сообщениями (очереди, служебная шина и т. Д.)

+0

Звучит неплохо. Я пойду на его реализацию. Поблагодарили за вход. – w5m