Wie kann ich zeitbasierte / geplante Ereignisse in .NET durchführen?

8

Ich muss die Planung von Aktionen / Ereignissen auf unserer Website anbieten. Eine Mist-Analogie könnte ein Kalendersystem sein, bei dem eine Person ein Kalenderelement hinzufügt und wenn das Datum / die Zeit "getroffen" wurde, dann wird eine Logik (z. B. einen Bericht berechnen) ausgelöst.

Ich könnte Hunderte und sogar Tausende von geplanten Ereignissen haben, die von meinen Kunden eingegeben werden. Wenn ein Kunde etwas eingibt, um ihn zu planen, speichere ich diese Informationen in der Datenbank. Dann rate ich, dass ich irgendwo einen Event / Job hinzugefügt habe, der den Primärschlüssel der Datenbanktabelle enthält. Wenn das Ereignis ausgelöst werden soll, werde ich diese Information aus der Datenbank holen und dann die Logik machen. fertig.

Welche Lösungen gibt es dafür?

Ich verwende .NET 3.5 SP1. DB ist Sql Server 2008. UI wird jedoch webbasiert sein.

Ich war mir nicht sicher, ob Leute MSMQ benutzen? Oder etwas in Sql Server eingebaut? Oder eine Open-Source-Bibliothek (z. B. Quartz.NET ) mit einem NT-Dienst. Server wird Windows 2008 Standard Edition sein.

Auch - bitte keine Vorschläge, um einen Cron Job Äquivalent oder irgendwelche Befehlszeilenskripte, etc.

zu verwenden

Endlich, und das ist ein sekundäres Ziel .. ich würde es gerne auf azurblau für shiz und kichern ... so ist das auch möglich? es ist nur eine Wunschliste Idee. Ich würde es vorziehen, es in einer dedizierten Box zu tun, wenn die Lösung einfacher ist, als mit Azure.

Prost:)

edit: Logik, die verarbeitet werden soll, wenn ein Ereignis ausgelöst werden muss, sind Hintergrundjobs. Keine Benutzeroberfläche erforderlich.

    
Pure.Krome 19.06.2009, 01:03
quelle

8 Antworten

2

Quartz.NET könnte diese Anforderungen wahrscheinlich auch gut bewältigen. Die Vorteile, die ich sehe, sind verschiedene Möglichkeiten zum Einstellen des Schedulers (CronTrigger + Kalender) und die Möglichkeit, Ihre Jobs in kleinen Einheiten testbaren Codes (Jobs) zu haben.

Quartz.NET bietet Ihnen auch die benötigte Verteilung und Fail-Over mit Clustering-Funktionen. Ein nettes Feature sind auch per-Trigger konfigurierbare Fehlzündungs-Handling-Setups, die Ihnen die Möglichkeit geben, auf Fehlzündungen und Scheduler-Ausfallzeiten zu reagieren.

SQL Service Broker scheint den Vorteil von keiner Abfrage zu haben, ich frage mich, ob das jemals das Problem sein wird, Broker hat den Nachteil, ein bisschen kompliziert zu klingen (zumindest aus der Beschreibung, die ich oben gelesen habe).

Nur meine voreingenommenen $ 0,02.

    
Marko Lahma 30.06.2009, 23:16
quelle
4

Workflow Foundation kann dies tun. Verwenden Sie eine verzögerte Aktivität und stellen Sie die Zeitspanne auf (DesiredTimeOfExecution - Now) ein. Legen Sie für größere Systeme UnloadOnIdle auf true fest, und die ausstehenden Workflows werden beibehalten, bis sie benötigt werden.

Hier ist ein sehr einfaches Beispiel für die Delay-Aktivität .

WF ist Free und ist Teil von .NET Framework 3.0.

    
Cheeso 19.06.2009 05:08
quelle
2

Was Sie wollen, ist SQL Server Service Broker.

Sie können zeitgesteuerte Datenbankzugriffe für die Abfrage von Kalenderdaten usw. verwenden. Es ist messagesbasiert, leistungsfähiger als MSMQ, erfordert keine Abfragen und kann in verteilten Umgebungen verwendet werden, wenn dies erforderlich ist. Funktioniert gut für mich!

Sie treffen eine gespeicherte Prozedur, um Ihre Ereignisinformationen in eine SSB-Warteschlange in der Datenbank zu schreiben. Sie geben dieser Nachricht in Zukunft eine Uhrzeit, um aufzuwachen und eine weitere gespeicherte Prozedur zu verarbeiten, die Ihre Ereignisdaten erfasst und in eine Abholwarteschlange einfügt, die eine "externe Aktivierung" ausführt. EA sendet eine Benachrichtigung an einen Windows-Dienst, der auf eine Konsolen-App verweist. Diese Konsolenanwendung erfasst die Ereignisinformationen aus der Abholwarteschlange. Jetzt haben Sie Ihre Ereignisdaten genau zum gewünschten Zeitpunkt. Verarbeiten Sie es wie Sie möchten in der Konsolen-App.

Es gibt zwar eine Lernkurve, aber es lohnt sich, wenn Sie die Zuverlässigkeit, Flexibilität und Skalierbarkeit von SQL Service Broker benötigen. Im Folgenden finden Sie einige Links, die Ihnen den Einstieg erleichtern.

Hier ist ein Vergleich: SQL Service Broker vs. MSMQ

SO würde mir leider nur erlauben, einen Link zu posten. Sonst könnte ich Sie auf mehr Ressourcen hinweisen, um Ihnen den Einstieg in SSB zu erleichtern.

Hoffe, das hilft!

    
Stacy Murray 19.06.2009 05:28
quelle
1

Eine Option könnte darin bestehen, einen SQL-Job zu erstellen, der mit dem genauesten Intervall ausgeführt wird, das Sie haben, und dann alle Ihre Ereignisse verarbeitet.

Wenn Sie das Beste aus der .NET- und der SQL Server-Welt wollen, können Sie SQL-Jobs verwenden und verwalteten Code aufrufen . Ich habe keine Erfahrung mit dieser Lösung, also entschuldige ich mich im Voraus, wenn die Ressource, die ich zur Verfügung gestellt habe, nicht sehr gründlich ist.

Wenn die Aufgaben sehr komplex sind und Sie keine Assemblys auf SQL Server laden wollen oder Ihnen ihr Planungssystem einfach nicht gefällt, dann würde ich einen .NET Windows-Dienst mit einem Scheduler-Plugin eines Drittanbieters empfehlen. Persönlich, wenn der gesamte Code in einer gespeicherten Prozedur oder einer Reihe von gespeicherten Prozeduren gespeichert werden könnte, würde ich eine Arbeit machen, da ich denke, dass es viel leichter zu verwalten ist und eine Menge Arbeit wurde bereits für Sie erledigt.

Bearbeiten

Ich habe gerade einen Kommentar bemerkt, der die Granularität erklärt. Wenn Sie einige Aktionen ausführen müssen, die jede Minute ausgeführt werden müssen, wäre eine .NET-Service-Lösung wahrscheinlich einfacher, da Sie wahrscheinlich eine Art Multi-Threading-Lösung implementieren müssten.

    
Dave L 19.06.2009 02:04
quelle
1

Sie werden einen Job-Scheduler und einen Job-Manager benötigen, da Sie eine kleine Granularität haben und Sie a priori wissen müssen, ob alle Jobs, die in einer bestimmten Minute ausgeführt werden, in der nächsten Minute zu Ende sind.

>

Das macht den Job des Schedulers einfach. Sie sollten eine DB-Tabelle haben, die Ihre Jobs speichert und jede Minute einen Job Scheduler-Service zu dieser Tabelle gehen lassen und die Jobs auswählen, die erledigt werden müssen.

Es wird diese Jobs mit einem Jobmanager in die Warteschlange stellen. Sie können eine andere Tabelle oder eine Transaktionswarteschlange verwenden, um Ihren Job in die Warteschlange einzureihen. Ihr Jobmanager-Dienst überwacht die Jobwarteschlange. Sie können Ihre eigenen Rollen erstellen oder BizTalk verwenden, um die Jobwarteschlange zu überwachen und eine Orchestrierung oder Workflow . Es zieht die Aufgaben einzeln aus der Warteschlange, führt die Aufgaben aus und aktualisiert den Status des Jobs in der Datenbank.

Ihr Problem wird die Skalierbarkeit sein, abhängig von der Anzahl der Benutzer, der Anzahl der Aufgaben, die sie in die Warteschlange stellen und wie intensiv (Zeit, Speicher, CPU usw.) jede Aufgabe sein darf. Wenn ich Sie wäre, würde ich die 1-Minuten-Zeitgranularität zurücknehmen und sie auf 5 Minuten schieben. Was brauchst du um 13:38 Uhr? dass du nicht bis 1:40 pm warten kannst. zum? :)

    
JP Alioto 19.06.2009 02:24
quelle
1

Dies ist bereits ein diskutiertes Problem bei StackOverflow. Bitte gehen Sie durch Brauchen Sie Job-Scheduler in asp.net

Sie haben vergessen, die wichtigste Information in Ihrer Frage hinzuzufügen - ASP.Net

Es beschreibt ein Scheduler-Framework für ASp.Net-Web-Apps, das wie ein Dienst ausgeführt werden kann und Ihnen eine Methode zur Verfügung stellt, die periodisch aufgerufen wird. Anschließend können Sie Ihre Logik auslösen, um Ereignisse zu laden und mit Timern zu quittieren.

Auch dieser ist die billigste aller Alternativen. Hoffe, das ist was du brauchst.

    
MSIL 19.06.2009 04:17
quelle
0

Es hängt ein bisschen von der Natur des Systems ab. Ausgehend von der Annahme, dass die vollständige Definition der Ereignisse in der Datenbank gespeichert ist:

  • Wenn das Ereignis etwas in einer Web-UI verursachen muss, überprüfen Sie bei Aktualisierungen die Tabelle auf Einträge, die "passiert" sind, und fügen Sie der nächsten Webanforderungsausgabe die entsprechenden visuellen Indikatoren / Bildschirme / Popups hinzu.
  • Wenn sich Ihre Ereignisse auf die Hintergrundverarbeitung beziehen, besteht die einfachste Lösung darin, eine separate eigenständige .NET-Anwendung zu schreiben, die die Datenbankereignistabelle nach neuen Datensätzen abfragt und anhand der Uhr überprüft, welche Ereignisse eingetreten sind. Sie können sich etwas einfallen lassen und das Threading einbeziehen, wenn einige der Ereignisse lange laufende Prozesse usw. verursachen, aber das wäre das grundlegende Design. (Verwenden Sie nur Threading, wenn Sie ... eine einfache Singlethread-App benötigen, die die Tabelle aufruft)
jerryjvl 19.06.2009 01:19
quelle
0
  

Dann rate ich, dass ich irgendwo einen Event / Job hinzugefügt habe, der den Primärschlüssel der Datenbanktabelle enthält. Wenn das Ereignis ausgelöst werden soll, werde ich diese Information aus der Datenbank holen und dann die Logik machen.

Ich weiß nicht, was die übliche Lösung ist, aber wenn ich das Rad neu erfinde, denke ich daran, einen Datenbankclusterindex für die Ereigniszeit zu erstellen, damit ich die Datenbank jede Minute mit einer Aussage wie ... abfragen kann / p> %Vor%     

ChrisW 19.06.2009 02:07
quelle