2008-09-23 7 views
44

Wenn Sie beauftragt wurden, ein Ereignisplanungssystem zu erstellen, das wiederkehrende Ereignisse unterstützt, wie würden Sie es tun? Wie gehen Sie damit um, wenn ein wiederkehrendes Ereignis entfernt wird? Wie können Sie sehen, wann die zukünftigen Ereignisse passieren werden?Designfrage: Wie würden Sie ein wiederkehrendes Ereignissystem entwerfen?

Wenn Sie ein Ereignis erstellen, können Sie "täglich wiederholen" (oder wöchentlich, jährlich usw.) auswählen.

Ein Entwurf pro Antwort bitte. Ich bin an Ruby/Rails gewöhnt, benutze aber, was immer du willst, um das Design auszudrücken.

Ich wurde dies in einem Interview gefragt, und konnte nicht mit einer wirklich guten Antwort, die ich mochte.

Hinweis: war already asked/answered here. Aber ich habe gehofft, einige praktischen Details zu erhalten, wie unten beschrieben:

  • Wenn es notwendig, um Daten zu kommentieren oder auf andere Weise in der nur eine Instanz des wiederkehrenden Ereignisses Wie würde das funktionieren?
  • Wie würden Ereignisänderungen und -löschungen funktionieren?
  • Wie berechnen Sie, wenn zukünftige Ereignisse passieren?
+1

Ich liebe diese Frage, aber ich vermute, dass es geschlossen wird. –

+0

@ joe-van-dyk Hey, ich habe das gleiche Problem, können Sie bitte Ihre Empfehlungen und Link auf Ihre Git-Lösung im Antwortteil !? Ich glaube, du hast dieses Problem gelöst. Ich bin im Datenmodell im Allgemeinen interessant. Danke – Sergii

Antwort

0

Wenn das Ereignis Speichern ich den Zeitplan zu einem Geschäft retten würde (nennen wir es „Termine“ und ich würde berechnen, wenn das Ereignis das nächste Mal zu schießen war und speichern das auch zum Beispiel in „Events“. dann habe ich in „Events“ aussehen würde und herauszufinden, wann das nächste Ereignis stattfinden sollte und gehen bis dahin schlafen.

wenn die App „aufwacht“ würde es berechnen, wenn das Ereignis sollte erneut stattfinden, speichern Sie dieses in "Ereignisse" erneut und führen Sie dann das Ereignis aus.

Wiederholen.

Wenn während des Schlafens ein Ereignis erstellt wird, wird der Schlaf unterbrochen und neu berechnet.

Wenn die App von einem Sleep-Ereignis oder einer ähnlichen Situation startet oder wiederhergestellt wird, überprüfen Sie "Ereignisse" auf bestandene Ereignisse und handeln Sie entsprechend (je nachdem, was Sie mit verpassten Ereignissen machen möchten).

So etwas wäre flexibel und würde keine unnötigen CPU-Zyklen erfordern.

+0

Könntest du in die Zukunft schauen und sehen, wann die kommenden Ereignisse sein würden? –

2

Ich musste dies vorher tun, als ich die Datenbank Ende des Projekts verwaltete. Ich habe darum gebeten, dass jedes Ereignis als separate Ereignisse gespeichert wird. Dadurch können Sie nur einen Vorfall entfernen oder Sie können einen Bereich verschieben. Es ist viel einfacher, Vielfache zu entfernen als zu versuchen, ein einzelnes Vorkommen zu modifizieren und es in zwei zu verwandeln. Wir waren dann in der Lage, eine andere Tabelle zu machen, die einfach eine recurrenceID hatte, die die Information der Wiederholung enthielt.

0

Aus der Spitze von meinem Kopf (nach ein paar Dinge Überarbeitung während der Eingabe/Denken):

Bestimmen Sie die Mindestrezidiv Auflösung benötigt; So läuft die App. Vielleicht ist es täglich, vielleicht alle fünf Minuten.

Speichern Sie für jedes wiederkehrende Ereignis die letzte Laufzeit, das Laufintervall und andere nützliche Funktionen wie die Ablaufzeit, wenn dies gewünscht wird.

Jedes Mal, wenn die App ausgeführt wird, überprüft sie alle Ereignisse, vergleicht (today/now + recurrenceResolution) mit (recentRunTime + runInterval) und löst das Ereignis aus, wenn sie übereinstimmen.

2

@Joe Van Dyk fragte: "Könnten Sie in die Zukunft schauen und sehen, wann die bevorstehenden Veranstaltungen stattfinden würden?"

Wenn Sie sehen/Anzeige die nächsten n Vorkommen eines Ereignisses wollten sie entweder a) im Voraus berechnet werden müssen, würde und irgendwo oder b gespeichert) on the fly berechnet werden und angezeigt. Dies wäre für jeden abendlichen Rahmen derselbe.

Der Nachteil bei a) ist, dass man irgendwo ein Limit setzen muss und danach b). Einfacher zu benutzen b), um damit zu beginnen.

Das Scheduling-System benötigt diese Informationen nicht, es muss nur wissen, wann das Ereignis next ist.

+0

Oder mischen Sie die beiden. Berechnen Sie On-Demand (b) und speichern Sie die Ergebnisse zur späteren Referenz (a). –

0

Als ich eine Kalender-App für mich geschrieben habe mumble Jahren, habe ich im Grunde nur den Zeitplanungsmechanismus von Cron gestohlen und das für wiederkehrende Ereignisse verwendet. zB: Etwas, das am zweiten Samstag jedes Monats außer Januar stattfindet, würde die Anweisung "repeat = * 2-12 8-14 6" beinhalten (jedes Jahr, Monate 2-12, die zweite Woche läuft vom 8. bis zum 14., und 6 für Samstag, weil ich für die Wochentage 0-basierte Nummerierung verwendet habe).

Während dies es ziemlich einfach zu bestimmen, ob das Ereignis an einem bestimmten Datum auftritt, ist es nicht in der Lage, "alle N Tage" Wiederholung zu behandeln und ist auch eher weniger als intuitiv für Benutzer, die nicht unix-versiert sind.

Um mit eindeutigen Daten für einzelne Ereignisinstanzen und Entfernung/Neuterminierung umzugehen, habe ich nur verfolgt, wie weit Ereignisse für die Ereignisse berechnet und gespeichert wurden und in der Datenbank gespeichert wurden, wo sie dann geändert oder verschoben werden konnten gelöscht, ohne die ursprünglichen wiederkehrenden Ereignisinformationen zu beeinflussen. Wenn ein neues wiederkehrendes Ereignis hinzugefügt wurde, wurden alle Instanzen sofort bis zum vorhandenen Datum der "letzten Berechnung" berechnet.

Ich behaupte nicht, dass dies der beste Weg ist, es zu tun, aber es ist ein Weg, und eine, die ziemlich gut innerhalb der Grenzen funktioniert, die ich bereits erwähnt habe.

0

Wenn Sie ein einfaches Reoccuring-Ereignis haben, z. B. täglich, wöchentlich oder ein paar Tage pro Woche, was ist mit der Verwendung von buildt in scheduler/cron/at functionallity falsch? Erstellen einer ausführbaren/Konsolen-App und Einrichten, wann sie ausgeführt werden soll? Kein kompliziertes Kalender-, Event- oder Zeitmanagement.

:)

// W

+1

funktioniert nicht für eine Webanwendung –

9

Ich begann einige zeitliche Expression als outlined by Martin Fowler umzusetzen. Dies sorgt dafür, herauszufinden, wann ein geplanter Gegenstand tatsächlich auftreten sollte. Es ist eine sehr elegante Art, es zu tun. Was ich am Ende hatte, war nur eine Zusammenfassung dessen, was in dem Artikel steht.

Das nächste Problem war herauszufinden, wie in der Welt die Ausdrücke zu speichern. Das andere Problem ist, wenn Sie den Ausdruck auslesen, wie passen diese in eine nicht so dynamische Benutzeroberfläche?Es war die Rede davon, die Ausdrücke einfach in ein BLOB zu serialisieren, aber es wäre schwierig, den Ausdrucksbaum zu durchlaufen, um zu wissen, was damit gemeint war. Die Lösung (in meinem Fall) besteht darin, Parameter zu speichern, die zu der begrenzten Anzahl von Fällen passen, die die Benutzerschnittstelle unterstützt, und von dort aus diese Informationen zum Erzeugen der temporalen Ausdrücke im laufenden Betrieb verwenden (könnte serialisiert werden, wenn sie zur Optimierung erzeugt wird.)). Also hat die Schedule-Klasse verschiedene Parameter wie Offset, Startdatum, Enddatum, Wochentag usw. und daraus können Sie die temporalen Ausdrücke generieren, um die harte Arbeit zu erledigen.

Für Instanzen der Aufgaben gibt es einen "Dienst", der Aufgaben für N Tage generiert. Da dies eine Integration in ein bestehendes System ist und alle Instanzen benötigt werden, ist dies sinnvoll. Eine API wie diese kann jedoch leicht dazu verwendet werden, die Wiederholungen zu projizieren, ohne alle Instanzen zu speichern.

Verwandte Themen