Timer programmieren im Backend?
Meine Frage ist eher drauf bezogen, wie es umsetzbar ist:
Ich möchte eine Gruppe erstellen können, wo User drinne sind, die dann in einer Datenbank abgespeichert werden. Und wenn sie start klicken, soll ein request zum Backend geschickt werden und eine Funktion startet, die den Timer für alle gleichzeitig runterzählt.
Wie zeige ich den Timer nur für diese Gruppe für alle synchron an . Muss ich die Sekundenzahl in der Datenbank abspeichern und jede Sekunde updaten zur GruppenID, oder geht es auch einfacher?
2 Antworten
oder geht es auch einfacher?
Oh ja, sogar viel einfacher:
- Beim Anlegen eines neuen Timers speicherst du neben den sonstigen Angaben wie z.B. Timer-ID, Beschreibung (optional), Gruppen-ID, usw. noch exakt zwei weitere Dinge: Die aktuelle Systemzeit des Servers (Startzeit des Timers) als Unix-Zeitstempel (Anzahl der Sekunden seit 01.01.1970 00:00:00) und die Laufzeit des Timers in Sekunden.
- Beim Abrufen des Timers nimmst du dir Beschreibung (optional), Startzeit und Laufzeit aus der Datenbank.
- Dann nimmst du die aktuelle Systemzeit des Servers (ebenfalls wieder als Unix-Zeitstempel) und ziehst den Startzeitpunkt davon ab. Damit hast du die im Moment gelaufene Zeit des Timers.
- Als nächstes werden Beschreibung (optional), momentane Laufzeit und Gesamtlaufzeit an den Client übermittelt.
- Alles weitere ist ab hier "Darstellungszeugs" und sollte daher im Frontend geregelt werden.
P.S.: Auf diese Weise hast du für jeden Timer höchstens zwei Schreibzugriffe: Beim Anlegen und beim Löschen. Außerdem reicht es damit aus, z.B. alle paar Minuten den lokalen Datenstand mit dem des Servers abzugleichen, was den Server in nicht geringem Maße entlastet.
Du verrätst herzlich wenig über deine Applikation. Ist das eine Webapp oder was? Sind die Clients ständig verbunden, und womit? Was soll denn passieren, wenn die Zeit abgelaufen ist?
Allgemein wird es sinnvoll sein, für die betreffende Gruppe nur den absoluten "Endzeitpunkt" in der zentralen Datenbank zu speichern (wenn du nichts anderes hast um so einen relativ flüchtigen Zustand zu speichern, etwa Redis). Die Clients können sich dann selbst darum kümmern, einen hübschen Countdown bis zu diesem Zeitpunkt anzuzeigen - d.h. das ständige Aktualisieren passiert gar nicht im Backend.
Tipp: am besten alles in UTC oder der Einfachkeit halber gleich als sekundengranularen Unix Timestamp speichern. Es geht ja offenbar eh nur um die Zeitdifferenz.