JavaScript Änderungen anderer User Synchron mitverfolgen.

mercsen

Lt. Commander
Registriert
Apr. 2010
Beiträge
1.681
Moin moin liebe CB Gemeinde.

Wiedereinmal habe ich eine Frage, die allerdings mehr tehoretischer Natur ist.

Und zwar geht es im folgenden um einen Kalender zur Mitarbeiterverwaltung.
In diesem Kalender werden nach tagen sortiert Projekte angezeigt auf die Mitarbeiter eingeplant werden können.

Das ganze System steht auch und so weiter, was wir, bzw. ich jetzt einbauen will ist eine Funktionalität ähnlich G+ oder FB.

Sprich wenn ein user an einem projekt etwas ändert soll jeder andere User der ebenfalls dieses Projekt offen hat, oder aber es nur im Kalender sieht über diese Änderungen informiert werden.

Ich hab mir da mehrere möglichkeiten Überlegt.
Es wird eh für jede veränderung im System ein protokoll Eintrag angelegt, diesen müsste man also nur periodisch abfragen und immer nur die neuesten Einträge lesen und anschließend entsprechend das DOM manipulieren.

Da ist meine Sorge allerdings das es unnötig viel Serverlast verursacht.
Einen weg diese zu umgehen wäre z.b. das alle 10 / 20 / 30 sekunden eine protokoll datei erstellt wird und jeder client nur diese abruft, so müsste nicht jeder selber die DB nerven.

Das problem ist das er die dann auch erstellen würde wenn gar niemand arbeitet, z.b nachts.
( könnte man umgehen indem man einen master clienten festlegt der die regelmäßig erstellen lässt, geht er weg wird der nächste zum master clienten und ist keiner da wird auch kein protokoll mehr erstellt, bin mir aber über die relaisierung unsicher)

Zweite möglichkeit wäre die verwendung von websockets. Also jeder client meldet sich beim server an und wenn jemand was ändert schickt er ganz simple die änderung an alle Clienten raus.
Ich würde den Server dann in java Schreiben.
Dazu meine frage: hat jemand erfahrung damit und kann mir etwas zur performance sagen?
Ist die kommunikation zwischen java server und php leicht ? Ich dachte da einfach an eine lokale socket verbindung zum server.....

sprich php ändert etwas, schickt über nen socket ne nachricht an den java server und der verteilt die dann an alle verbunde clienten. Ich habe hier noch nen alten chat server liegen, der könnte genau das übernehmen ;)

Übersehe ich möglichkeiten?
Zu welcher würdet ihr raten?

Server Power steht fast unbegrenzt zur verfügung da Geld keine große rolle spielt. (natürlich sollte das ergebnis trotzdem keine reosurcen verschwenden)

Und auch an eingesetzer software ist alles erlaubt, ich habe so ziemlich freie hand.
Könnte MySql selber sogar solche Delta Daten erstellem? Also alle änderungen seit meiner letzen anfrage?

und keine sorge, es ist dafür gesorgt das nur ein user zur zeit einen datensatz bearbeiten kann ;)

Derzeit arbeiten etwa 20 Leute gleichzeitig, verteilt auf 2 Niederlassungen mit dem System.
Ende des Jahres kommt eine dritte Niederlassung und ca. 10 weitere benutzer dazu.

Im schnitt werden pro tag 200 positionen disponiert.
Projekte gibts im schnitt 30 / tag

(zumindest in der aktuellen version)

Einzige vorausetzung: Technik muss in Chrome relaisierbar sein
 
Zuletzt bearbeitet:
wieso willst du einen java server für eine webanwendung schreiben?
mach doch einfach einmal in deinem javascript nen eventlistener der auf einen ajax response horcht.. wenn der response kommt dann halt die meldungen anzeigen..
und in deinem php script erezeugst du den ajax response beim speichern
 
hmmm??
das musts du mir genauer erklären.

Ein user A bearbeitet z.b. das Projekt 0001.
beim speichern erzeugt PHP dann ajax respond.... (meinst du nen http respond?)
an wen wird der geschickt?
User B, C, D etc. die an anderen rechnern sitzen sollen ja dann mitgeteilt bekommen das A gerade etwas an 0001 geändert hat.

bin ja offen für alles, aber deinen weg kann ich noch net so ganz nachvollziehen. Und wie kann ich nen eventlistener auf nen ajax respond machen? die seite aufrufen und nen timeout verhindern? Und die seite wird erst erzeugt wenn ein user was geändert hat?

den java server woltle ich halt genau für den letzen punkt machen. der soll dann die verteilung der daten an die clients übernehmen, die sich per websocket am server angemeldet haben.

server kann meinetwegen auch in ruby, perl oder c++ geschrieben sein, aber java habe ich schon einige erfahrung im Client / Server bereich sammeln können (chat, FTP server, p2p etc).
 
Zuletzt bearbeitet:
Mercsen schrieb:
Zweite möglichkeit wäre die verwendung von websockets. Also jeder client meldet sich beim server an und wenn jemand was ändert schickt er ganz simple die änderung an alle Clienten raus.

3. Möglichkeit: Server Sent Events. Das ist in 100 Zeilen Code implementiert und du brauchst keinen komplexen Standard implementieren. Und es gibt auch einen Polyfill für alle alten Browser.
Da du keine wirkliche bidirektionale Kommunikation brauchst, sondern nur ein Push mit Updates sind Server Sent Events die optimale Lösung ;) Leider sind sie völlig zu unrecht neben den total gehypten Websockets kaum bekannt.

Nachtrag: das ganze nutzt kein Polling ;) Es werden über eine dauerhafte bestehende Verbindung einfach immer neue Daten zum Client gepusht, also genau was du haben möchtest.
 
Zuletzt bearbeitet:
Wenn du Websockets verwenden willst, dann würde sich Node.js für den Server anbieten.
 
wenn du gegen Polling-Verfahren nix hast, dann setz dir für deine "Veränderungsmitteilung" einen NodeJS - Server parallel zu deinem Apache auf, der halt auf einem anderen Port mithört (8080 oder sowas). Ajax-Polls schickste dann per Redirect an den NodeJS und werden Event-basiert abgehandelt. Alles andere geht klassisch an den Apache. Sowas ist kompliziert, aber schweineschnell.

Goddammit... zu langsam *G*
 
SSE sieht ganz interessant aus. Ist glaube ich genau das was ich suche, muss mich da mal ein wenig einlesen. Soganz verstehe ich das Funktionsprinzipt nicht. Wenn ich z.b. eine eventsource('update.php') mache. Wann sendet update.php denn dann etwas an den clienten? Es soll ja nicht durchgehend ausgeführt werden.

aber da werde ich mich schon einlesen. Node.JS sieht auch ganz interessant aus, SSE scheint mir aber vollkommen ausreichend zu sein, hoffe ich ;)

Die kannte ich nicht und eine kommunikation vom cleinten zum server läuft ja ohnehin über JavaScrpt direkt zu php, da machen sockets also keinen sinn.
Finde das schon konmisch das ich noch nie davon gehört habe, wird aber auch wirklich selten im netz erwähnt.

danke soweit, aber diskussion darf gerne fortgeführt werden. :)
 
Mercsen schrieb:
Soganz verstehe ich das Funktionsprinzipt nicht. Wenn ich z.b. eine eventsource('update.php') mache. Wann sendet update.php denn dann etwas an den clienten? Es soll ja nicht durchgehend ausgeführt werden.
Dieses PHP-Beispiel ist eventuell verständlicher, man sollte es zwar nie in PHP umsetzen, zeigt aber wie simpel es funktioniert.
Es ist einfach so, dass sobald du Daten in die HTTP-Antwort schreibst, diese sofort beim Client ankommen. Du musst also in deiner Java-Anwendung beim Updaten des Kalenders eine Logik einbauen, dass der Java-Http-Server diese Info bekommt, und dieser schreibt es dann als SSE-Antwort in die Http-Antwort, fertig.

Mercsen schrieb:
Finde das schon konmisch das ich noch nie davon gehört habe, wird aber auch wirklich selten im netz erwähnt.
Das ist das traurige, für reines Push vom Server zum Client ist SSE den Websockets Meilen überlegen (kein komplexes Protokoll nötig, kein Webserver mit Websocket-Unterstützung nötig) aber kaum bekannt, weil Websockets eben extremst gehypt werden.
 
Zuletzt bearbeitet:
Nach ein wenig probieren und lesen bin ich auch zu dem Schluss gelangt es nicht in PHP umzusetzen. Das ist ja fast das gleiche als wenn jeder client selber alle 10 sekunden bei der Datenbank nachfragt.

Ich werde mir mal NodeJS genauer angucken, hab mit serverseitigem JS noch nichts zu tun gehabt. Damit müsste man doch auch sse realsieren können oder?
Und wie könnte ich dem Node Server dann von einem PHP Skript mitteilen lassen jetzt mit der verteilung zu starten?

@ice-breaker: das programm ist ebenfalls in PHP geschrieben, aber offensichtlich muss ich nen java server verwenden wenn ichs mit node JS net gebacken bekomme. leider drängt die zeit ein wenig da ich ab August eine neue Anstellung habe, da ist keine Zeit sich groß in ein neues System einzuarbeiten. Aber das kann ich noch net sagen.

so komplex müssen websockets doch aber auch nicht sein?
Man kann doch trotzdem HTTP request verschicken? Oder nur reine json daten, hab das eigentlich bisher als großen vorteil gesehen. Zumindest in allen Fällen die ich mir so erdacht habe, kann da auch absolut falsch liegen, sind meine ersten Schritte in die Richtung.

P.S.
eine idee die ich mal hatte, aber schnell wieder verworfen hatte war folgende:
Jedem Datensatz in der Datenbank einen timestamp der letzen änderung aufdrücken und dann persiodisch nach einträgen suchen die einen größeren timestamp haben als die letze heruntergeladene aktuallisierung.
Nachteile:
- der datendurchsatz wird ungleich höher
- viele "müll" daten, haben nix mit der funktion an sich zu tun, nur mit der präsentation
- man müsste natürlich für jede tabelle, bzw. jedes obejkt das man so beobachten will eine eigene datei erstellen. z.B. updateProjekte.php, updateMitarbeiter.php und alle einzelnd abfragen. Bzw. die in eine datei packen, Trotzdem kann man so nicht gut verallgemeinern.
Aber auch hier könnte man halt eine zentrale update datei erstellen lassen, welche die clients runterladen, trotzdem bin ich kein freund dieser idee..... meinungen ? :)
 
Zuletzt bearbeitet:
Die Kommunikation vom PHP-Skript zum Node könntest du über eine Message Queue herstellen. Mit Redis lässt sich so etwas sehr einfach bauen.
 
Mercsen schrieb:
Ich werde mir mal NodeJS genauer angucken, hab mit serverseitigem JS noch nichts zu tun gehabt. Damit müsste man doch auch sse realsieren können oder?
ja und habe ich schon, sind die genannten 100 Zeilen ;)
Bei dem verlinkten Polyfill ist sogar eine komplexe Demo, aber wirklich komplex ;) Nimm noch den Webserver Express dazu und der Code schrumpft auf die genannten 100 Zeilen inklusive deiner Kalender-Anbindung.
Node.JS ist verdammt einfach ;)

Mercsen schrieb:
Und wie könnte ich dem Node Server dann von einem PHP Skript mitteilen lassen jetzt mit der verteilung zu starten?
PHP macht einen HTTP-Request an Node.js und sendet ein paar Infos mit ;)
Einen Webserver brauchst du auf Node.js Seite ja sowieso für SSE, und so hast du 2 Fliegen mit einer Klappe geschlagen.
Redis ist natürlich auch eine Variante, aber irgendwie "sinnlos" (sorry NullPointer) wenn der Node.js Server sowieso schon nen Webserver hat, kann man auch über diesen die Daten an Node.js pumpen, dann braucht man nicht noch ne Software, die administriert werden muss.

Mercsen schrieb:
@ice-breaker: das programm ist ebenfalls in PHP geschrieben, aber offensichtlich muss ich nen java server verwenden wenn ichs mit node JS net gebacken bekomme. leider drängt die zeit ein wenig da ich ab August eine neue Anstellung habe, da ist keine Zeit sich groß in ein neues System einzuarbeiten. Aber das kann ich noch net sagen.
ich denke du wirst in Java länger brauchen als in Node.js.
Eventuell finde ich nachher auch mal 10 Minuten Zeit und bastel dir ne Vorlage.

Mercsen schrieb:
so komplex müssen websockets doch aber auch nicht sein?
Man kann doch trotzdem HTTP request verschicken?
äh, nein ;) Websockets sind ein eigenes Protokoll auf Basis des HTTP-Standards, du musst erst das Protokoll upgraden und und und.
RFC6455 nicht gerade wenig oder ;)

Mercsen schrieb:
Aber auch hier könnte man halt eine zentrale update datei erstellen lassen, welche die clients runterladen, trotzdem bin ich kein freund dieser idee..... meinungen ? :)
wofür Polling implementieren wenn es mit SSE live sein kann? :D
 
Zuletzt bearbeitet:
danke für diese ausführliche erklärung.

Sehr nett das eine vorlage basteln willst und verstehe mich nicht falsch, ich weiß das zu schätzen, würde trotzdem gerne drauf verzichten. wo bleibt denn sonst der spaß ;) Wissen aneigenen und dann umsetzen. aber vlt. werde ich ja demnächst rumjammern und hilfe suchen ;D

das mit den websockets war mir so nicht bewusst, dachte da gibts schon ne art standart bzw. der nutzt einfach auch http.
aber naja, haben in der uni schon einige protokolle implementieren müssen, trotzdem versuche ich mich dann an NodeJS!

Danke an alle, wie immer schnell und kompetent geholfen :)
 
Zurück
Oben