Expandable
2005-11-22, 18:33:20
Hallo allerseits,
ich schreibe ein Programm für Feuerwehren, zur besseren Kommunikation und übersicht während eines Einsatzes/Katastrophenfalles.
Dieses Programm - das war eine der Anforderungen - ist webbasierend, also rein in PHP geschrieben. Es ist also so organisiert, dass auf einem Server der Wache Apache + MySQL + PHP läuft, und darauf eben das Programm. Alle Clients greifen dann eben per Netzwerk auf den Server zu (und das sind einige, deswegen wollte man nicht auf jedem PC ein extra Programm installieren und updaten müssen. Die webbasierende Lösung hat das Problem umgangen...).
Nun ist es natürlich so, dass Feuerwehrleute extremst paranoide Menschen sind (und natürlich völlig zu recht) und das Netzwerk zusammenberechen könnte im Katastrophenfall. Bzw. schlimmer wird's noch, wenn der Einsatzleiter vor Ort (ÖEL) über das Internet/UMTS-Netz an den Server auf der Wache angebunden ist.
Fällt die Verbindung aus, hat der ÖEL KEINERLEI Daten mehr. Das kann natürlich nicht sein. Also ist geplant, dass im ELW (Fahrzeug des ÖEL) ebenfalls Apache + MySQL + PHP installiert wird.
Nun soll das so ablaufen: Auf dem Laptop des ÖEL ist praktisch immer eine Kopie der Datenbank des Hauptservers auf der Wache. Falls nun die Verbindung abbricht, übernimmt einfach der lokale Datenbankserver. Soweit ja kein großartiges Problem.
Problematisch ist bislang nur (zumindest wir ich mir das zur Zeit vorstelle), wie das mit dem Datenabgleich ist. Bei dem Programm gibt es viele laufende Nummern, Protokolle über Datenänderungen etc., die alle festgehalten werden müssen.
Wenn also jemand (auf der Wache oder der ÖEL) Daten einfügt, muss das nun auf zwei Servern gespeichert werden. Da haben wir schon das Problem mit PHP: Er versucht ja nun erstmal ewig, 'ne Verbindung zum Hauptserver herzustellen. Ist die Verbindung down, geht das Skript solange nicht weiter, bis PHP merkt, dass die Verbindung down ist (hoffe das ist verständlich). Also müsste man den Verbindungsstatus irgendwie extern überwachen. Auch noch möglich.
Komplett kompliziert wird's aber, wenn die Verbindung mal down war längere Zeit und dann wieder steht. Jetzt müssen ja eine Unmenge an Daten aktualisiert werden - sowohl auf dem Haupt- als auch auf dem Backupserver. Noch komplizierter wird's, wenn's mehr als zwei Server sind... es können ja auch mehrere ELWs im Einsatz sein, jeder mit seinem eigenen Backupserver. Also muss man z.B. 5 Datenbanken (Hauptserver + 4 Backupserver) nach einem Verbindungsabbruch wieder unter einen Hut bringen.
Jeder, der sich mit PHP auskennt, wird wohl erahnen, dass sowas mit PHP wohl nicht so gut zu lösen ist. Deswegen dachte ich mir, dass ein C/C++/C#-Programm den gesamten Datenabgleich übernimmt. Das einizige, was dieses Programm bräuchte, wäre Zugriff auf die lokale Datenbank sowie eine Verbindung zum Hauptserver. Ein extra Fenster würde über den aktuellen Verbindungsstatus, etc. informieren, Protokolle führen, etc.
Aus oben genannten Gründen soll das PHP-Skript jetzt nur noch Daten aus der lokalen Datenbank auslesen. Das Eintragen/Updaten von Daten im Hauptserver und die Angleichung der lokalen Datenbank an die Hauptdb soll das C#-Programm übernehmen. Falls der Benutzer also Daten einfügt, müsste PHP einen Insert/Update-MySQL-Query-String an das C#-Programm liefern. Was dann damit passiert, kann dem PHP-Programm wurscht sein, dass C#-Programm wäre dann so geschrieben, dass es die Daten auf jeden Fall in irgendeine Datenbank einträgt und nichts verloren geht.
Also noch mal kurz, zum besseren Überblick, wie ich mir das vorstelle:
PHP führt nur SELECTS aus, und zwar immer nur auf der lokalen Datenbank des ÖEL-Servers (bzw. auf dem Hauptrechner eben auf dem Hauptrechner). Das C#-Programm ist dafür verantwortlich, neue bzw. aktualisierte Daten auf SÄMTLICHEN Servern (also Hauptserver, und "Client-Server") einzutragen und die Datenbanken aktuell zu halten.
Ich hoffe das war so verständlich :)
Deswegen meine Fragen:
Wie übergibt man, bzw. kann man überhaupt, aus einem PHP-Programm einen String an ein C#-Programm übergeben? Geht das irgendwie über SOAP? Ach ja: Das ganze sollte unter Linux (Apache) und Windows (Apache/IIS) funktionieren - müsste also unter Mono (Apache unter Linux und Windows) bzw. .NET (IIS oder Apache unter Windows) laufen... ich weiß, das macht's nicht gerade einfacher :)
Erscheint euch dieses Konzept sinnvoll (wie die Daten abgeglichen werden, also was hat Priorität, etc., soll hier nicht das Problem sein... das sollen sich die von der Feuerwehr überlegen, ist mir nämlich egal... die sollen Richtlinien festlegen und dann isses so wie's is)?
Wie würden die einzelnen C#-Programme der einzelnen Master/Client-Server miteinander kommunizieren? Per (extra geschriebenem) TCP/IP-Interface? Oder auch über den "Umweg" von Apache irgendwie als HTTP-Request? (falls das möglich ist, hätte den Vorteil, dass das wohl grundsätzlich eher funktionieren wird, als was selbstgeschriebenes, denn in der Client/Serverprogrammierung kenne ich mich nicht so gut aus).
Bin für jede Hilfe (in Form von Anregungen, Kommentaren, Gedanken, und Links zu technischen Artikeln, die helfen würden) dankbar!
ich schreibe ein Programm für Feuerwehren, zur besseren Kommunikation und übersicht während eines Einsatzes/Katastrophenfalles.
Dieses Programm - das war eine der Anforderungen - ist webbasierend, also rein in PHP geschrieben. Es ist also so organisiert, dass auf einem Server der Wache Apache + MySQL + PHP läuft, und darauf eben das Programm. Alle Clients greifen dann eben per Netzwerk auf den Server zu (und das sind einige, deswegen wollte man nicht auf jedem PC ein extra Programm installieren und updaten müssen. Die webbasierende Lösung hat das Problem umgangen...).
Nun ist es natürlich so, dass Feuerwehrleute extremst paranoide Menschen sind (und natürlich völlig zu recht) und das Netzwerk zusammenberechen könnte im Katastrophenfall. Bzw. schlimmer wird's noch, wenn der Einsatzleiter vor Ort (ÖEL) über das Internet/UMTS-Netz an den Server auf der Wache angebunden ist.
Fällt die Verbindung aus, hat der ÖEL KEINERLEI Daten mehr. Das kann natürlich nicht sein. Also ist geplant, dass im ELW (Fahrzeug des ÖEL) ebenfalls Apache + MySQL + PHP installiert wird.
Nun soll das so ablaufen: Auf dem Laptop des ÖEL ist praktisch immer eine Kopie der Datenbank des Hauptservers auf der Wache. Falls nun die Verbindung abbricht, übernimmt einfach der lokale Datenbankserver. Soweit ja kein großartiges Problem.
Problematisch ist bislang nur (zumindest wir ich mir das zur Zeit vorstelle), wie das mit dem Datenabgleich ist. Bei dem Programm gibt es viele laufende Nummern, Protokolle über Datenänderungen etc., die alle festgehalten werden müssen.
Wenn also jemand (auf der Wache oder der ÖEL) Daten einfügt, muss das nun auf zwei Servern gespeichert werden. Da haben wir schon das Problem mit PHP: Er versucht ja nun erstmal ewig, 'ne Verbindung zum Hauptserver herzustellen. Ist die Verbindung down, geht das Skript solange nicht weiter, bis PHP merkt, dass die Verbindung down ist (hoffe das ist verständlich). Also müsste man den Verbindungsstatus irgendwie extern überwachen. Auch noch möglich.
Komplett kompliziert wird's aber, wenn die Verbindung mal down war längere Zeit und dann wieder steht. Jetzt müssen ja eine Unmenge an Daten aktualisiert werden - sowohl auf dem Haupt- als auch auf dem Backupserver. Noch komplizierter wird's, wenn's mehr als zwei Server sind... es können ja auch mehrere ELWs im Einsatz sein, jeder mit seinem eigenen Backupserver. Also muss man z.B. 5 Datenbanken (Hauptserver + 4 Backupserver) nach einem Verbindungsabbruch wieder unter einen Hut bringen.
Jeder, der sich mit PHP auskennt, wird wohl erahnen, dass sowas mit PHP wohl nicht so gut zu lösen ist. Deswegen dachte ich mir, dass ein C/C++/C#-Programm den gesamten Datenabgleich übernimmt. Das einizige, was dieses Programm bräuchte, wäre Zugriff auf die lokale Datenbank sowie eine Verbindung zum Hauptserver. Ein extra Fenster würde über den aktuellen Verbindungsstatus, etc. informieren, Protokolle führen, etc.
Aus oben genannten Gründen soll das PHP-Skript jetzt nur noch Daten aus der lokalen Datenbank auslesen. Das Eintragen/Updaten von Daten im Hauptserver und die Angleichung der lokalen Datenbank an die Hauptdb soll das C#-Programm übernehmen. Falls der Benutzer also Daten einfügt, müsste PHP einen Insert/Update-MySQL-Query-String an das C#-Programm liefern. Was dann damit passiert, kann dem PHP-Programm wurscht sein, dass C#-Programm wäre dann so geschrieben, dass es die Daten auf jeden Fall in irgendeine Datenbank einträgt und nichts verloren geht.
Also noch mal kurz, zum besseren Überblick, wie ich mir das vorstelle:
PHP führt nur SELECTS aus, und zwar immer nur auf der lokalen Datenbank des ÖEL-Servers (bzw. auf dem Hauptrechner eben auf dem Hauptrechner). Das C#-Programm ist dafür verantwortlich, neue bzw. aktualisierte Daten auf SÄMTLICHEN Servern (also Hauptserver, und "Client-Server") einzutragen und die Datenbanken aktuell zu halten.
Ich hoffe das war so verständlich :)
Deswegen meine Fragen:
Wie übergibt man, bzw. kann man überhaupt, aus einem PHP-Programm einen String an ein C#-Programm übergeben? Geht das irgendwie über SOAP? Ach ja: Das ganze sollte unter Linux (Apache) und Windows (Apache/IIS) funktionieren - müsste also unter Mono (Apache unter Linux und Windows) bzw. .NET (IIS oder Apache unter Windows) laufen... ich weiß, das macht's nicht gerade einfacher :)
Erscheint euch dieses Konzept sinnvoll (wie die Daten abgeglichen werden, also was hat Priorität, etc., soll hier nicht das Problem sein... das sollen sich die von der Feuerwehr überlegen, ist mir nämlich egal... die sollen Richtlinien festlegen und dann isses so wie's is)?
Wie würden die einzelnen C#-Programme der einzelnen Master/Client-Server miteinander kommunizieren? Per (extra geschriebenem) TCP/IP-Interface? Oder auch über den "Umweg" von Apache irgendwie als HTTP-Request? (falls das möglich ist, hätte den Vorteil, dass das wohl grundsätzlich eher funktionieren wird, als was selbstgeschriebenes, denn in der Client/Serverprogrammierung kenne ich mich nicht so gut aus).
Bin für jede Hilfe (in Form von Anregungen, Kommentaren, Gedanken, und Links zu technischen Artikeln, die helfen würden) dankbar!