2010-12-13 3 views
5

У нас есть несколько длинных бизнес-процессов, которые запускаются через службы WCF, работающие в IIS (интегрированном режиме) на WS 2008 R2. Эти бизнес-процессы обычно связаны с большим количеством взаимодействия с нашим сервером SQL Server. Мы создали обычную реализацию очереди задач, посредством которой запросы ставятся в очередь через начальный вызов службы и затем выполняются на основе приоритета. Это выполнение может занять много времени (максимум 20-30 минут). Затем клиенты могут запрашивать сервер для выполнения своих собственных фоновых задач.ThreadPools vs Own Threads для длительных процессов

В нашей текущей реализации задачи запускаются в отдельный поток для выполнения, а не из ThreadPool. Это было сделано из-за reading recommendations из-за отсутствия длительных задач с использованием ThreadPool, чтобы предотвратить голодание запросов ASP.NET. Мы контролируем количество потоков, порожденных, устанавливая верхний предел количества фоновых задач, которые могут выполняться одновременно. Таким образом мы пытаемся контролировать нагрузку на CPU и предотвращать слишком много переключений контекста потока. Хотя все это происходит, мы, конечно, все равно должны обслуживать обычные «он-лайн» запросы для приложения.

После прочтения this post Thomas Marquardt Меня беспокоит тот факт, что мы не используем ThreadPool, поскольку мы не получим преимущества эвристики настройки, встроенной в нее. Мы уже решаем проблему завершения работы, которую Томас упоминает, подключаясь к событию ApplicationEnd и отменяя длительные задачи. Итак, мой вопрос: переходим ли мы к использованию ThreadPool? Как насчет того, чтобы эти потоки были связаны в течение длительных периодов времени? Если я правильно понимаю Томаса, он говорит, что это не имеет значения, поскольку ThreadPool настроится на создание большего количества запросов для обслуживания обычных онлайновых операций? Я также прочитал this StackOverflow question, который охватывает те же самые основания, но я до сих пор не уверен в дальнейших действиях.

+0

Просьба уточнить: какая конкретная настройка, по вашему мнению, может отсутствовать? –

+0

Возможно, «мелодия» была неправильным словом для использования, но я имел в виду, что если фоновые задачи выполнялись с использованием потоков ThreadPool, ThreadPool «был бы awar» e дополнительной «нагрузки», помещаемой в систему фоновыми задачами. Если мы запускаем их с использованием обычных потоков, ThreadPool не знает этого. Опять же, у меня нет внутренних деталей того, как эвристика ThreadPool работает точно, но чтение через пост Томаса вызвало озабоченность с моей стороны тем, что мы перешагиваем эту «настраивающую» логику, встроенную в ThreadPool, -ThreadPool темы – Carel

ответ

1

Это не совсем то, что вы просили - но почему бы не выполнить ваши длительные задачи в отдельном процессе (скажем, службу Windows) все вместе - вы все равно создаете очередь приоритетов, и клиенты будут запрашивать результаты для некоторых позже. Я бы пошел с таким подходом, когда передняя сторона WCF Services приостанавливает запросы и отвечает на запросы обновления статуса, в то время как фоновая служба будет обслуживать запросы. Это позволит даже переработать рабочий процесс и т. Д., Не беспокоясь о завершении выполнения текущих задач. Единственная проблема, которую я вижу, - это накладные расходы из-за связи с процессом, но тогда она должна быть незначительной по сравнению с временем, затраченным на выполнение задачи (поскольку они долго работают).

1

Мое предложение состоит в том, чтобы избежать ThreadPool, поскольку у меня есть проблемы с головоломкой, предложенные в ссылках, которые вы предоставили.

Наш продукт позволяет пользователю отключить вызов веб-службы, которая выполняет серию кавычек. Это может быть длительный процесс продолжительностью до 40 минут, процесс котировки имеет интенсивность процессора, поэтому мы используем пул потоков на нашем четырехъядерном сервере для получения максимального использования ЦП.

Однако, поскольку ASP.NET выглядит так, как будто он использует пул потоков для обслуживания запросов, у нас возникает проблема, при которой любые новые задания, отправленные пользователями, никогда не начинаются до тех пор, пока первое задание не завершится из-за отсутствия доступных потоков в бассейн. Чтобы обойти это, я использовал класс, который я нашел в Интернете некоторое время назад под названием ThreadPoolThrottle. Это немного усложняет проблемы, но по мере роста использования системы мы сталкиваемся с теми же проблемами.

Я сейчас рассматриваю предложение VinayC о запуске кавычек из процесса, чтобы предотвратить голодание в моем приложении asp.net.

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