Пакетная обработка на нескольких серверах

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

Теперь, чтобы масштабировать приложение для обработки 100 миллионов записей, нам нужно использовать ферму серверов для обработки каждого пакетного процесса. Есть ли в C# встроенная поддержка обработки запросов, выполняемых на ферме серверов? Любые мысли о том, как настроить исполняемый файл С# для работы с этой настройкой?


person Rajeshwaran S P    schedule 28.12.2010    source источник


Ответы (3)


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

В качестве примечания большинство распределенных рабочих систем управляются:

  1. Работа ставится в очередь на сервер партиями
  2. Рабочие процессы регистрируются на сервере, чтобы получить пакет для работы, доступный пакет помечается как обрабатываемый этим рабочим процессом.
  3. (необязательно) Рабочие процессы возвращаются к серверу с отчетом о состоянии (например: выполнено 10%, выполнено 20% и т. д.)
  4. Рабочий процесс завершает работу и отправляет результаты.
  5. Перейти к шагу 2.

Другой вариант — заставить 3 рабочих обработать один и тот же набор данных. Это позволит вам сравнить результаты. Если 2 или более имеют одинаковые результаты, вы принимаете эти результаты. Если все 3 имеют разные результаты, вы знаете, что есть проблема, и вам нужно проверить данные/код. Обычно это происходит только тогда, когда рабочие процессы находятся вне вашего контроля (например, SETI) или вы выполняете массовые вычисления и хотите исправить потенциальные проблемы с оборудованием.

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

Это позволяет вам добавлять или удалять столько отдельных рабочих процессов, сколько вы хотите, без необходимости что-либо перекодировать.

person NotMe    schedule 28.12.2010

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

person fejesjoco    schedule 28.12.2010

Почему бы не развернуть приложение с помощью распределенной среды? Я бы порекомендовал платформу CloudIQ. Вы можете использовать эту платформу для распространения своего кода на любое количество серверов. Он также обрабатывает балансировку нагрузки, поэтому вам нужно будет только отправить свои задания в инфраструктуру, и он будет обрабатывать распределение заданий по отдельным машинам. Он также отслеживает выполнение приложений, поэтому, если на одной из машин произойдет сбой, работающие там задания будут перезапущены на другой машине в группе.

Перейдите по ссылке Сообщество для загрузки, форумов и т. д.

person Brett McCann    schedule 14.01.2011