Рекомендации по разработке долгосрочного ресурсоемкого веб-сервиса - PullRequest
6 голосов
/ 12 ноября 2010

У меня есть функция .NET, которая выполняет сложные вычисления. В зависимости от переданных параметров, функция:

  • Займет от нескольких минут до нескольких часов
  • Использует 100% одного ядра во время вычислений
  • Требуется от 100 МБ до нескольких ГБ памяти.
  • Записывает на диск от нескольких МБ до нескольких ГБ данных
  • Может выдать исключение, в том числе OutOfMemoryException

Количество данных, подлежащих записи на диск, можно точно предсказать из параметризации функции. Нет простого способа предсказать другие требования к ресурсам из параметризации функции.

Мне нужно предоставить эту функцию через веб-сервис. Эта услуга должна быть:

  • Устойчиво и изящно сообщать о любых проблемах при расчете
  • Способен обрабатывать параллельные запросы, если имеется достаточно ресурсов для обработки запроса без значительного снижения производительности и для изящного отклонения запроса в противном случае.

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

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

Кто-нибудь с опытом подобных ситуаций имеет какие-либо предложения? Пока решение может работать на коробке Windows, можно рассмотреть все технологические варианты.

Ответы [ 2 ]

4 голосов
/ 12 ноября 2010

Я бы предложил разделить ваше приложение на две части.

  1. Сам веб-сервис.Его функциональность:
    • Получение рабочего элемента от клиента;
    • Передача этой работы в бэкэнд-сервис, выполняющий фактическую работу;
    • Отчет о ходе и результате;
  2. Бэкэнд-сервис.Это функциональность:
    • Обработка запросов от веб-службы;
    • Выполнение фактических вычислений.

Причины такого дизайна
1) довольно сложно обрабатывать рабочую нагрузку в размещенном приложении (ASP.NET), поскольку сервер (IIS) будет управлять ресурсами, тогда как в отдельном приложении вы имеете более прямой контроль;
2) двухуровневыйдизайн более масштабируемый - например, позже вы можете легко переместить серверную часть на другой физический компьютер (или несколько компьютеров).

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

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

2 голосов
/ 12 ноября 2010

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

О пуле вычислений: вы можете попробовать создать очередь вычислений (например, таблицу в базе данных). Таким образом, вы можете иметь несколько служб Windows на выделенных машинах, обрабатывающих вычисления. Это может позволить вам легче масштабировать.

...