2013-05-31 2 views
5

У меня возник вопрос о том, как лучше всего проверить, работает ли служба.Лучший способ проверить, виновата ли служба

Сначала немного разъяснений. У меня есть приложение C#, которое может быть запущено из командной строки или может быть запущено как служба Windows. Функция службы заключается в проверке изменений в удаленном стороннем источнике данных и обработке этих изменений, прежде чем добавлять их в наше собственное локальное хранилище данных.

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

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

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

Спасибо, M

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

Edit 2 Я думаю, что нужно быть немного понятнее: Основной причиной этого мониторинга является уведомить пользователя о потенциальной проблеме либо со службой или с подключением к услуге 3 партии. Сама услуга является однопоточной и имеет правильную обработку исключений и протоколирование. Скорее всего, эта служба будет запускаться на сервере где-то, если есть какие-либо проблемы с сервисом, и она перестает обновлять наше локальное хранилище данных по любой причине, которую служба должна уведомить кого-то.

+0

Есть ли у вашего сервиса какой-то цикл опроса? –

+0

Не могли бы вы показать нам псевдоописание того, что на самом деле делает ваша служба? Мы могли бы помочь определить место, где можно расположить какую-то форму сердцебиения. – KingCronus

ответ

-1

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

Поскольку наше приложение использует WebAPI, мне удалось настроить конечную точку, которую служба «проверяет» каждые [х] секунд.

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

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

4

вы могли бы хотеть рассмотреть что-то вроде «биения»:

Heartbeat activity for Windows Service

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

Windows, сам по себе имеет множество методов, чтобы помочь также:

Start > Run > Services.msc > Right Click Service > Properties > Recovery Options 

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

Дополнительно:

Неужели нет способа для вас действительно определяют разницу между «никакой работы не требуется» и повесить?

+0

Хуже всего то, что сервис многопоточен, и происходит ожидание или тупик. –

+0

@MatthewWatson Да, сердцебиение может помочь в этом, но я все равно хочу рассматривать первопричину. Тупики и Livelocks можно почти всегда исправить, используя правильное программирование потокобезопасности. – KingCronus

0

Вы можете использовать ServiceController класс в .net для мониторинга услуг.

Я столкнулся с той же проблемой в одном из моих проектов.

Я использовал нижний подход для наблюдения за моим сервисом.

  • Первое, я вошел все сведения, ошибки от моей службы в окне просмотра событий в стандартном формате, как этот

заказ кода события | DateTime | сообщение

  • Тогда я создал еще одну службу уведомлений, которая будет прослушивать просмотр событий событий для конкретных событий, считывает сообщение из записи события
  • , если запись о событии падает в средстве просмотра событий будет отправлять почту уведомления через SMTP
  • если вы не обеспечены SMPT затем для окон приложений , которые слушают событий и показывает сообщение, используя Baloon или сообщение окно
Смежные вопросы