Как спроектировать приложение .NET для выполнения одной и той же задачи несколько раз одновременно и независимо? - PullRequest
2 голосов
/ 17 сентября 2011

Мне нужно разработать приложение .NET, которое очень похоже на веб-паук / сканер.Получить данные с веб-сайта, обрабатывать данные, сохранять данные в базе данных и отправлять электронную почту.

Я хочу обработать столько сайтов одновременно, сколько машина может (в пределах разумного).Каждый процесс не зависит друг от друга.Я буду использовать некоторые сторонние серверные компоненты, такие как Chilkat Software .Используется только один компьютер.Начиная с Windows 7 64bit, затем перейдя на Windows Server.

Какую архитектуру или дизайн мне следует использовать, что отвечает требованиям, которые я упомянул?Запуск нескольких экземпляров приложения (самый простой способ)?Использование Windows WorkFlow Foundation (никогда не использовал)?Какая-то параллельная обработка?..?Указатель на пример приложения, который следует предложенному дизайну, является плюсом.

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Вы можете использовать конвейерную архитектуру: crawl -> process -> save to db -> email;Потоково-безопасные очереди должны использоваться для соединения разных фаз;каждая фаза может быть индивидуально настроена на использование N потоков.Затем в производственной среде измерьте и настройте количество потоков, которое может использовать каждая фаза, так чтобы ни одна фаза не ожидала, пока другие фазы предоставят / потребят данные в течение большей части времени.

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

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

0 голосов
/ 22 сентября 2011

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

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

См. Лабораторные работы в нашем Руководстве для начинающих по рабочему процессу страница

0 голосов
/ 17 сентября 2011

Я бы рекомендовал использовать библиотеку System.Threading.Tasks для чего-то подобного.

Затем вы можете сделать что-то подобное в своем приложении:

foreach(var input in listToProcess)
{
  Task.Factory.StartNew(() => ProcessInput(input));
}

private static void ProcessInput(Foo myInput)  // for example, this might be a url in your case
{
  // your specific processing here: get data from site, process, save, email
}
...