Daten auf verschiedenen Rechnern synchronisieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo,
ich habe bei uns im Labor einen Arbeitsplatz mit einem Touchpanel-Computer (Linux, Python, Qt-Eingabemaske, My-SQL-DB) für Messwerteingaben ausgestattet. Soweit, so gut. Nun kommt der Wunsch auf, die Eingabe auf den selben Datensatz doch auch von einem zweiten oder dritten Touchpanel zu ermöglichen.

Die Eingaben müssten also synchron gehalten werden, d.h. wenn in einem Panel eine Eingabe erfolgt, müsste die auch (nach 0-30 sec) in der Eingabemaske auf dem anderen Panel erscheinen. Wie mache ich das? MySqlDB kommt auf zentralen Server. OK. Und dann?

Kann die MySqlDB bei Eingabe ein Event erzeugen, dass von den anderen Panels (Python/Qt) aufgefangen wird? Oder muss ich die DB immer mit Python auf Veränderungen pollen? Oder kann das Python-Programm auf dem einen Panel bei Veränderung ein Event erzeugen, dass dann von den Python-Programmen auf den anderen Panels aufgefangen wird und eine neue DB-Abfrage (=Synchronisation) auslöst, muss da so eine Art Daemon laufen, der auf die Events wartet? Geht das mit Python? (mit meinen C-Programmierkenntnissen kann ich leider nicht im Zirkus auftreten)

Ich hoffe, es ist verständlich, was ich meine.

Danke!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

AFAIK kann MySQL so ein Ereignis *nicht* ausloesen. Du musst also deine Clients irgendwie anders informieren. Ich wuerde das mit einem zentrales Server machen, der auch gleich die SQL Datenbank bedient. Ob die Clients ueberhaupt noch DB-Zugriff brauchen kann ich nicht beurteilen - aber wenn sie den nur fuer die Verarbeitung der Eingabe benoetigen, dann wuerde ich das auch gleich den Server machen lassen.

Server kann man zB mit dem websockets-Modul bauen https://github.com/aaugustin/websockets

Ich wuerde mir aber noch mal ein paar warme Gedanken machen, ob das so wirklich eine gute Idee ist, oder ob nicht ein optimistic locking ausreicht. Sprich: wer eine Eingabe macht, und die Abschickt, aber in der Zwischenzeit wurde etwas anderes schon abgeschickt - dann gibt's eine Fehlermeldung. Das reicht ggf. auch, und da braucht man nur die DB fuer.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

PostgreSQL hat NOTIFY und LISTEN für IPC. Dafür gibt es auch ein Python-Modul pgpubsub. Ich habe es noch nie verwendet aber es sollte machbar sein, dass deine Clients auf Events warten (LISTEN -> GUI Update) und selber Events schicken (NOTIFY) bzw. die Events mit Triggern in der Datenbank generierst (was mMn. ziemlich cool ist 8) ). Es ist allerdings fraglich ob es den Aufwand wert ist, ich würde es wie __deets__ machen und je nach Bedarf noch einen Weg zum manuellen refreshen der Daten einbauen.
the more they change the more they stay the same
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Websockets sind eher was für Browser basierte Applicationen, bei Qt würde man eher einen klassischen Message Broker wie celery oder RabbitMQ nehmen. Nimmt man PostgreSQL dann kann man sich den Broker in diesem Fall wohl sparen. Für ein neues Projekt würde ich allerdings tatsächlich per Websockets eine Browserbasierte Eingabemaske programmieren. Man spart sich einfach den Installations-, Aktualisierungs- und Wartungsaufwand auf zig Maschinen.
Antworten