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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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