Welcher Weg ist besser: Per SOAP VarUpdate Messages pollen oder PHP-Script mit Events

Hi!

Ich bin für ein Browser-Projekt derzeit dabei einen DataServer in node.js zu schreiben, der an ein Browserprogramm aktiv per Push Updates für Variablen sendet. Dieser Teil der Kommunikation (ich nutze hier WebSockets für die Verbindung und tausche JSON-Messages aus) funktioniert schon sehr schön, im Browser werden die Anzeigen sauber aktualisiert.

Nun bin ich dabei den DataServer um die Schnittstelle nach IPS zu erweitern - und da stellt sich mir jetzt die folgende Frage:

Wie aktualisiere ich das Prozessabbild des DataServers an effizientesten, ohne dabei den IPS-Server zu überlasten.

Um eine Idee für den Umfang des Prozessabbilds im DataServer zu bekommen habe ich mal überschlagsmäßig gerechnet:
Es verbinden sich 10 Clients mit dem DataServer. Jeder Client visualisiert parallel rund 40 Werte, wobei 15 davon auf allen Clients identisch sind (also insgesamt nur 1x benötigt werden). Damit wären wir bei 15 gemeinsammen und 25 separaten, also insgesamt bei 265 Variablen.

In einem ersten Design habe ich 2 PHP-Skripte erstellt, welche die Variablenversorgung übernommen haben:
SendUpdates.php wurde per Ereignis (Variablenänderung) für jede benötigte Variable getriggert und hat VariablenID und Wert in eine JSON-Message verpackt und an den DataServer gesendet (dieser hat für diesen Zweck eine HTTP-Komponente erhalten, die dann den Wert ins Prozessabbild übertragen und an alle abonierenden Clients gesendet hat).
ControlUpdates.php war per IPS-WebServer erreichbar und hat vom DataServer in JSON-Messages gepackte Befehle erhalten. Über die entsprechenden IPS-Funktionen hat dieses Skript dann neue Ereignisse für SendUpdates angelegt oder nicht mehr benötigte gelöscht. Im Testbetrieb hatte ich aber max. 2 Clients aktiv, so das die Anzahl der Events, die an SendUpdates.php gekoppelt waren, recht überschaubar geblieben ist. Was passiert aber wenn ein IPS-Skript mit 260 Variablen-Update-Events gekoppelt ist? Kann der IPS-Server das verwalten und wie sieht es dann mit der Performance aus?

Als alternative bin ich jetzt auf die SOAP-Schnittstelle gestossen, bei welcher ich ja theoretisch nur den Message-Server belauschen und die benötigten UpdateVariable-Events herrausfiltern brauche. Theoretisch leider weil ich bisher noch keinen funktionierenden node.js-Kode habe, um GetSessionMessages zu verwenden. Ich kann zwar schon die Session starten, erhalte auch eine SessionID, aber beim GetSessionMessages scheitere ich an einer Exception: „SOAP-ENV:Server: Ein Name beginnt mit einem ungültigen Zeichen.“. Derzeit habe ich keine Ahnung wo der Fehler zu suchen ist. Aber zurück zum Thema, wenn ich jetzt mit dem DataServer 1x pro Sekunde die Messages abholen würde, wie wäre da die Belastung des IPS-Servers?

Für Infos / Anregungen wäre ich dankbar.

PS: Wenn da draußen jemand ist, der schon Erfahrungen mit node.js hat, würde ich gerne mal mit demjenigen in Gedankenaustausch treten.

Schau dir mal IPS_GetSnapshotChanges der 2.6 an. Dort kannst du alle Messages angreifen und die relevanten an einen DataServer weiterschieben.

paresy

Hi Paresy,

danke erst mal für deine schnelle Antwort und den Hinweis auf IPS_GetSnapshot und IPS_GetSnapshotUpdate.

Verstehe ich das richtig, das ich also beim ersten Aufruf IPS_GetSnapshot nehme, danach dann zyklisch
mit IPS_GetSnapshotUpdate arbeiten kann (z.B. jede Sekunde) und IPS mit dann immer nur die Änderungen
gegenüber dem letzten Aufruf (durch Weitergabe des letzten Timestamps als Aufrufparameter) übermittelt?

Meine Variablen könnte ich dann einfach aus dem Objekte-Array des jeweiligen Snapshots extrahieren und an meinen DataServer verfüttern?

Wenn ich das richtig verstanden habe kann ich mir ja den Aufwand mit SOAP sparen. Bzgl. meiner oben angesprochenen Datenmengen hast du da bedenken wegen der Performance? Ich würde die Updates am liebsten sekündlich abholen. Evtl. reiche ich auch einfach alle Variablenobjekte an den Dataserver weiter und filtere dort die benötigten Variablen herraus.

Welchen Weg würdest du da gehen um die Performance optimal zu halten?

Es ist definitiv performanter als die SOAP Schnittstelle. Sekündlich sollte kein Problem sein - macht die Konsole auch. Was die Last auf deinem Server betrifft musst du es ausprobieren.

paresy

Hallo Paresy,

ich versuche, die IPS_GetSnapshotChanges zum laufen zu bringen (habe die aktuelle 2.6er). Wenn ich das hier mache:

$changes = IPS_GetSnapshotChanges(time() - 60);

wuerde ich vermuten, dass ich damit die Aenderungen der letzten Minute abfrage. Stattdessen kommt die Fehlermeldung:

Warning: Requests into the future are not possible in C:\IPS\scripts\39595.ips.php on line 4

Was mache ich falsch?

Danke

Adrian


$letzteTS = IPS_GetSnapshotChanges(0)[0]['TimeStamp'];
//letzten 50 Meldungen einlesen
print_r(IPS_GetSnapshotChanges($letzteTS-50));

Die TimeStamp hat nichts mit der Zeit zutun… Die ist eher als Counter zu verstehen, der bei jeder Meldung hochzählt.

paresy

Ach … OK, verstanden, vielen Dank!

Adrian

Wäre dann nicht COUNTER die bessere Bezeichnung ??

Wobei ich TimeStamp besser fände, wenn man damit auch noch auf die Historie zugreifen könnte - perfekt

Dann müsste man für reine Logger-Funktionalitäten nicht den Betrieb stören

@Dapor: finde ich auch. Vielleicht bin ich deswegen instinktiv davon ausgegangen, dass es ein Zeitwert ist :slight_smile: