Лучшая методология разработки долго работающих процессорных приложений на C#

У меня есть несколько различных приложений C# worker, которые выполняют различные непрерывные задачи: отправка электронных писем из очереди, импорт новых заказов из базы данных веб-сайта в базу данных заказов, создание резервных копий и восстановлений базы данных, запуск обработки данных для OLTP -> OLAP и другие связанные задачи. Раньше я выпускал их как службы Windows, но в настоящее время я выпускаю их как обычные консольные приложения. Все они основаны на единой среде выполнения задач, которую я создал, и я доволен этим, однако я не уверен, каков наилучший способ развертывания приложений такого типа. Мне нравится консольная версия, потому что она быстрая и простая, и можно быстро увидеть активность программы и результаты. Недостатком является то, что на рабочем компьютере работает несколько экранов консоли, и он становится грязным. С другой стороны, для развертывания метода службы требуется много времени, и мне приходится просматривать журналы событий, чтобы увидеть сообщения. Какой опыт / комментарии по этому поводу?

8 ответов

Решение

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

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

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

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

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

Я собираюсь проголосовать за Windows Services. Управлять этими консольными приложениями станет настоящей болью.

Развертывание службы Windows легко: после первоначальной установки вы просто выключаете их и делаете XCOPY. Не нужно запускать какие-либо сложные установщики. Это только полусложно в первый раз, и даже тогда это просто

installutil MyApp.exe

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

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

Почему бы не получить лучшее из всех миров и использовать что-то вроде:
http://topshelf-project.com/

Это позволит вам запустить вашу программу в виде командной строки или службы Windows.

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

Мы регулярно используем службы Windows в качестве фоновых процессов. Мне не нравятся приложения командной строки, так как для их запуска необходимо войти на сервер. Службы работают в фоновом режиме все время (при условии, что они запускаются автоматически). Они также тривиальны для установки с помощью инструмента командной строки sc.exe, который находится в Windows. Мне нравится это лучше, чем bloat -ware, который является installutil.exe. Конечно, installutil делает больше, но мне не нужно то, что он делает. Я просто хочу зарегистрировать свой сервис.

Мы также создали инфраструктуру, в которой у нас есть общая служба.exe, которая загружает файлы.DLL на основе определения интерфейса, поэтому добавление новой "службы" так же просто, как добавление новой библиотеки DLL и перезапуск узла службы.

Однако мы начали отходить от услуг. Проблема, с которой мы сталкиваемся, заключается в том, что они блокируют библиотеки DLL (по понятным причинам), поэтому их сложно обновлять. Нам нужно остановить, обновить и перезапустить. Не сложно, но дополнительные шаги. Вместо этого мы переходим на специальные "страницы" в наших приложениях asp.net, которые выполняют фактические фоновые задания, которые нам нужны. Есть еще сервис, но все, что он делает, это вызывает страницы asp.net, поэтому он не блокирует ни одну из наших DLL. Затем мы можем заменить библиотеки DLL в каталоге bin asp.net и обычные правила asp.net для запуска перезапуска домена приложения.

Другие вопросы по тегам