Лучшие практики отказоустойчивости и надежности для запланированных задач или услуг - PullRequest
12 голосов
/ 27 мая 2010

Я работал над многими приложениями, которые запускаются как служба Windows или по расписанию.

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

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

Мне было любопытно, есть ли лучшие рекомендации, чтобы сделать запланированные задачи / службы Windows отказоустойчивыми и надежными.

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

Ответы [ 2 ]

7 голосов
/ 27 мая 2010

Мне интересно, что говорят другие люди, но я дам вам несколько замечаний, с которыми я столкнулся:

  1. Создание обработчика событий для необработанных исключений. Таким образом, вы можете очистить ресурсы, записать в файл журнала, отправить электронное письмо администратору или все, что вам нужно, вместо того, чтобы он зависал.

    AppDomain.CurrentDomain.UnhandledException + = новый UnhandledExceptionEventHandler (AppUnhandledExceptionEventHandler);

  2. Переопределите все необходимые обработчики событий в основной части вашего приложения. OnStart и OnStop довольно важны, но есть много других, которые вы можете использовать. http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx

  3. Остерегайтесь таймеров. Таймеры Windows Form не будут работать прямо в сервисе. Пользователь System.Threading.Timers или System.Timers.Timer. Лучший таймер для использования в службе Windows

  4. Если вы обновляете в потоке, убедитесь, что вы используете блокировку () или монитор в ключевых разделах, чтобы убедиться, что все работает с потоками.

  5. Будьте осторожны, чтобы не использовать ничего конкретного пользователя, поскольку служба работает без определенного пользовательского контекста. Я заметил, что некоторые строки подключения SQL больше не работают для авторизации Windows и т. Д. Также слышал, что у людей возникают проблемы с подключенными дисками.

  6. Никогда не обслуживайте с помощью пользовательского интерфейса. На самом деле для Vista и 7 они делают практически невозможным. Это не должно требовать взаимодействия с пользователем, самое большее, что вы можете сделать, это отправить сообщение с функцией WIN32. MSDN утверждает, что создание интерактивных сервисов - плохая практика. http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx

  7. Для целей отладки очень здорово заставить сервис работать как консольное приложение, пока вы не получите то, что хотите. Удивительный урок: http://mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html

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

0 голосов
/ 27 мая 2010

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

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

...