2010-05-27 12 views
11

Ich habe an vielen Anwendungen gearbeitet, die als Windows-Dienst oder geplante Aufgaben ausgeführt werden.Best Practices für Fehlertoleranz und Zuverlässigkeit für geplante Aufgaben oder Dienste

Nun, ich will dafür sorgen, dass diese Anwendungen fehlertolerant und zuverlässig sein. Beispielsweise; Ich habe einen Service, der jede Stunde läuft. Wenn der Dienst während des Betriebs oder des Betriebs abstürzt, möchte ich, dass die Anwendung für denselben Zeitraum erneut ausgeführt wird (es sind mehrere Dinge damit verbunden, einschließlich Transaktionen der Datenverarbeitung), um Datenverlust zu vermeiden. Außerdem möchte ich das Programm, um den Fehler mit Details zu melden. Mein Ziel ist es, Datenverlust zu vermeiden und nicht hinter dem Programm zurückzufallen.

Ich habe eine Klassenbibliothek erstellt, die ein Benutzer in ein Projekt importieren kann. Die Bibliothek soll die Information der laufenden Instanz des Programms halten, dh. Programm liest und schreibt Informationen über Laufintervall, Laufstatus usw. Diese Daten werden in einer Datenbank gespeichert.

Ich war neugierig, wenn es einige Best Practices sind die geplanten Aufgaben/Windows-Dienste fehlertolerant und zuverlässig zu machen.

Edit: Ich spreche über unabhängige Aufgaben oder Dienstleistungen, die auf verschiedenen Servern. und mein Ziel ist es, sicherzustellen, dass der Dienst weiterläuft, Fehler zu melden und sich von ihnen zu erholen.

+0

Ich habe mich selbst gefragt! – Brandi

+0

Die beste Werbung, die ich gefunden habe, ist FireDaemon. Nicht sicher, wie es läuft, ich bin gerade dabei es zu untersuchen. Aber seine beworbenen Funktionen sind großartig. –

+0

Danke, ich habe es überprüft. Ich würde es lieber codieren und kontrollieren. – DarthVader

Antwort

6

Ich bin daran interessiert, was andere Leute zu sagen haben, aber ich werde Ihnen ein paar Punkte, die ich über gestolpert:

  1. einen Event-Handler Ausnahmen für Nicht behandelte Stellen. Auf diese Weise können Sie Ressourcen bereinigen, in eine Protokolldatei schreiben, eine E-Mail an einen Administrator senden oder alles, was Sie benötigen, anstatt es abstürzen zu lassen.

    AppDomain.CurrentDomain.UnhandledException + = neuer UnhandledExceptionEventHandler (AppUnhandledExceptionEventHandler);

  2. außer Kraft setzen Servicebase Event-Handler Sie im Hauptteil Ihrer Anwendung benötigen. OnStart und OnStop sind ziemlich wichtig, aber es gibt viele andere, die Sie verwenden können. http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx

  3. von Timern Vorsicht. Windows Forms Timer funktionieren nicht direkt in einem Dienst. Benutzer System.Threading.Timers oder System.Timers.Timer. Best Timer for using in a Windows service

  4. Wenn Sie bei einem Thread aktualisieren, vergewissern Sie sich, dass Sie in den Schlüsselabschnitten eine lock() oder einen Monitor verwenden, um sicherzustellen, dass alles threadsicher ist.

  5. Vorsicht nichts benutzerspezifische zu verwenden, da ein Dienst ohne einen bestimmten Benutzerkontext ausgeführt wird. Ich habe bemerkt, dass einige meiner SQL-Verbindungszeichenfolgen nicht mehr für Windows-Autorisierungen usw. funktionieren. Habe auch gehört, dass Leute Probleme mit zugeordneten Laufwerken haben.

  6. nie einen Dienst mit einem UI machen. Tatsächlich machen sie es für Vista und 7 fast unmöglich, es trotzdem zu tun.Es sollte keine Benutzerinteraktion erfordern, das meiste, was Sie tun können, ist eine Nachricht mit einer WIN32-Funktion zu senden. MSDN behauptet, interaktive Dienste seien eine schlechte Praxis. http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx

  7. Für Debugging-Zwecke ist es so cool Dienst ausgeführt als Konsolenanwendung zu machen, bis Sie es zu tun, was Sie wollen es. Ehrfürchtig Tutorial: http://mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html

Wie auch immer, die Hoffnung, die hilft ein wenig, aber das ist nur ein paar, was ich um stieß auf eigene Faust zu finden.

0

Etwas offensichtlich - führen Sie nicht alle Ihre Aufgaben gleichzeitig aus. Versuchen Sie, sie so zu planen, dass nur eine Aufgabe zu irgendeinem Zeitpunkt eine teure Ressource verwendet (wenn möglich). Wenn Sie beispielsweise Newsletter und bestimmte Benachrichtigungen versenden möchten, planen Sie sie zu unterschiedlichen Zeiten ein. Wenn zwei Aufgaben etwas in der Datenbank bereinigen müssen, lassen Sie das eine nach dem anderen laufen.

Planen Sie auch Aufgaben außerhalb der normalen Geschäftszeiten - nachts natürlich.

+0

Ich sprach über unabhängige Aufgaben oder Dienste, die auf verschiedenen Servern. und mein Ziel, sicherzustellen, dass der Dienst weiterläuft, melden Sie alle Fehler und beheben Sie diese mit minimalem oder keinem Datenverlust. – DarthVader