2010-04-05 3 views
2

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

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

Что мне нужно для разработки, как распределить задачи клиентам? Должен ли я просто создавать очередь задач, а участники задач постоянно проверяют очередь, чтобы узнать, готова ли новая задача? Каким будет лучший способ обеспечить выполнение задачи только одним бегуном? Как я мог также обеспечить равномерное распределение задач между участниками задач, чтобы один бегун задания не заканчивал обработку нагрузок, а другие обрабатывали только несколько штук?

Единственный другой подход, о котором я мог подумать, заключается в том, что каждый бегун задачи делает TCP-соединение с сервером и регистрирует его интерес, а затем, когда новая задача готова, веб-приложение выбирает задачу и запускает задачу до это задача для обработки?

У кого-нибудь есть другие идеи? указатели? или комментариев?

Большое спасибо

Matt

ответ

3

общий подход к этой проблеме будет:

  • Реализовать комплекс услуг WCF, которые выставляют «задачу под управлением» функциональность как операции;

  • Развертывание служб WCF на нескольких хостах/машинах, размещенных в качестве служб Windows (все они должны использовать один и тот же контракт);

  • Настройка служб WCF для использования Microsoft Message Queuing binding (netMsmqBinding), все с использованием одной очереди в транзакционном режиме;

  • Настройте отдельные приложения управления для отправки своих запросов в очередь сообщений с использованием того же netMsmqBinding;

  • При необходимости развертывайте приложения/службы управления в сети с балансировкой нагрузки, такие как IIS Web Farm (если вы хотите увеличить масштабируемость на интерфейсе).

Это, вероятно, самые трений подхода, как вы можете полагаться на проверенных инструменты для обработки балансировки нагрузки (IIS/NLB), безопасность сообщений и сериализации (WCF) и доставка сообщений и транзакции управления (MSMQ). Большая часть работы уже сделана для вас.

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

+0

Похоже, у меня есть чтение, чтобы сделать =) –

+0

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

+0

@Matt: Не совсем, если эти клиенты находятся в одной общей области/сети. Если вы пытаетесь создать свою собственную широко распространенную систему Folding @ Home, и у вас есть тысячи клиентов, которые являются ненадежными/ненадежными, то это может быть немного слишком упрощенным, но вопрос о том, что * величина не та, что я может ответить в течение нескольких минут или даже часов. – Aaronaught

2

+1 для Aaronaught, но я также предложил бы посмотреть на что-то вроде NServiceBus, которое может абстрагировать справедливую часть деталей реализации для вас. Вы все равно можете использовать MSMQ и/или WCF для фактической транспортировки, просто упростите настройку издателей и подписчиков.

+0

Дополнительным преимуществом NServiceBus является то, что он уже имеет встроенный механизм распределения работы. –

0

Я написал что-то вроде этого некоторое время назад, и я выбрал то, что, по моему мнению, был простым методом, в значительной степени описанным вами: каждый агент (бегун задачи) регистрируется с «сервером управления» для целей администратора. Затем он периодически проверяет сервер на работу. Если в очереди есть что-то, это занимает первое (старое) задание. Сервер отмечает это задание как незавершенное, поэтому никакие другие агенты не возьмут его. Балансировка нагрузки не была проблемой, потому что каждый агент выполнял только одно задание за раз. WCF очень хорошо заботился о очереди сообщений, так что не было необходимости в том, чтобы два агента выполняли ту же работу. Когда агент завершает работу, он сообщает серверу и передает любой результат.

Я определил три конечных точки WCF для моего сервера управления: один для агентов, один для «консоли», используемый для отправки заданий (приложение winforms), и один для инструмента администрирования. Мой сервер управления был реализован как веб-служба, размещенная в службе Windows.

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

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

  • Нет связанных вопросов^_^