Anfrage Programmierung - Datenverteilung über Internet an Clientprogramme
-
Hallo,
ich benötige eine Lösung für folgende Aufgabe.
Ich habe ein Programm das Daten in eine MYSQL Datenbank schreibt. Nachdem mein Programm neue Daten in die Datenbank reingeschrieben hat, möchte ich das ein dutzend anderer Programme vom gleichen Typ, darüber informiert werden, dass neue Daten vorhanden sind.
Die Programme sind weltweit auf verschiedenen PC´s installiert und nur über Internet verbunden. Die anderen Programme sollen nachdem sie darüber informiert wurden das neue Daten vorhanden sind in der Datenbank, entweder selbst eine Abfrage starten an die Datenbank oder mit den neuen Daten auf anderem Weg versorgt werden.
Ich würde mich freuen wenn mir da jemand behilfreich bei sein kann für eine Lösung und Angebote machen kann.
-
Hallo,
kein Angebot aber eine Lösungsidee:
MySQL im Master-Slave Betrieb (damit hättest du eine Replikation) und dann regelmäßig von den Clientpcs die Slaves abfragen. Ein Push von der DB ist imo nicht möglich.
-
Headhunter schrieb:
Hallo,
Ein Push von der DB ist imo nicht möglich.Zumindest nicht in MySQL.
-
Poste mal bitte deine Emailadresse
-
hallo meine emailadresse ist: lamoe150999 (at) yahoo . de
also ich würde mich sehr freuen wenn jemand mir helfen kann das zu erstellen und ein Angebot macht.ich habe mal auch hier noch etwas Text eingefügt, was andere Leute mir bisher geraten haben:
Irgendwo steht ein zentraler Server.
An diesen kann Programm "A" seine Daten senden und zwischenspeichern.
Die anderen Programme senden bei ihrer Interneteinwahl ihre IP an den Server.
Somit weiss der Server "ich kann senden".
Der Server guckt bei sich nach ob von Programm "A" etwas gekommen ist und sendet es dann an die anderen Programme.
Bei Erfolg macht der Server einen Vermerk um nicht unnötig oft an die anderen Programme zu senden.(die frage ist ob der server senden kann, also der mysql server direkt kann es glaub ich nicht, aber eine Anwendung könnte man vielleicht schreiben die es sendet.)
Die Klienten könnten bei der Anwort, neben der IP, auch eine eindeutige Identifikation (z.B. Benutzernamen) mitsenden.
So kann der Server kontrollieren ob die gesendeten Daten auch wirklich den richtigen Klienten erreicht haben.(sowas ist sicher angebracht das man nur an registrierte User/Clienten was sendet.)
Softwaretechnisch könnte man das durch ein Proxy-Objekt lösen, das die Clientseite der Server-Push-Funktionalität implementiert und empfangene Nachrichten vom Server ggf. zwischenspeichert. Das Programm kann dann in beliebigen Abständen Anfragen an dieses Proxy-Objekt stellen und die Nachrichten „abholen“. Dadurch kann das restliche Programm weiter pull-basiert ablaufen.
(davon verstehe ich nichts, finde aber das es sich gut anhört)
Ich würde das ganze mittels XML-RPC oder SOAP lösen. Das HTTP Protokoll wird ja wahrscheinlich eh verwendet und somit kann man dann entsprechend die Requests senden und auf einen Response warten. Somit können die Programme auch mit unterschiedlichen Programmiersprachen entwickelt werden. Auf dem zentralen Server sollte dann neben der Datenbank ein entsprechendes "Server Programm" laufen, was die Kommunikation zur Datenbank übernimmt zwecks Sicherheit. Die Clients könnten sich dann beim Server an- und abmelden, so dass nur aktive Clients in seiner Online-Liste sind. Bei Timeouts etc. muss man sich überlegen, ob man es noch ein 2. mal probiert oder ob man den Client aus der Online-Liste wirft. Gibt genug Möglichkeiten.
Wichtig wäre, dass das Server-Programm alles korrekt steuert.(das hört sich auch gut an)
1. Jedes Programm trägt sich beim Start in eine zentrale DB im Internet ein ( Erreichbar unter IP ... )
2. Jedes Programm hat grundsätzlich eine Empfangseinheit ( Wenn auf Port 12366 Daten, dann für mich )
3. Der Rechner, der senden kann ( möglicherweise alle ) fragen die zentrale DB aus 1. ab und versendet die Daten an dort hinterlegte IPs.
4. Verschlüsselung/Entschlüsselung kann in die Sende/Empfangseinheit eingebaut werden.Du lässt das Programm nicht abfragen, ob etwas in der DB steht, sondern lässt zB die DB die Daten versenden wenn Daten da sind. Dein Programm nimmt Daten an, wenn etwas auf dem jeweiligen Port samt Check ( "Dein HAL meldet sich") stattfindet.
Du machst ein Event auf, dass die Netzleitung auf Port XXX abhört. Wenn da etwas kommt, dann muss das erste Paket ein Systemschlüssel (tagesdatum XOR Dein Geburtstag oder wie auch immer ) sein, um die nachfolgende Nachricht als glaubwürdig einzustufen. im Gamecodingbereich oder bei einer Chatanwendung wird sich sowas sicherlich finden.
(hört sich auch gut an)
Also ich habe mal die Ideen kommentiert, selber bekomme ich es leider halt noch nicht hin und freue mich daher über jedes Angebot.
Besten Dank an Alle und schönen Grüß und schönen Tag noch.
-
Ist totaler Quatsch mit dem eintragen der IP und senden an die Clients.
Es ist ja nicht sicher ob der nicht hinter einer Firewall steht. Sollen er eigentlich.
Server zu Client spart zwar Traffic aber bringt nur Probleme.
Lass die Client zyklisch abfragen an einen Webservice stellen.
Der Webservice kann sich auch merken ob in die DB über diesen Webservice etwas vorhanden ist.
Problem hierbei: Was wenn ein neuer Client hinzukommt.
Speichert man eine Liste dann kann man gleich mit jeden Client die DB abfragen.Somit bleibt nur:
Webservice für beide.
Clients überprüfen zyklisch die DB.Angebot kann erst gemacht werden wenn du dich entschieden hast wie es gemacht werden soll bzw. welche Plattform (Linux,Windows) und welcher Webservice (PHP,JSP,ASPNET) verwendet werden soll.
-
Hallo Unix-Tom,
vielen Dank für deine Hilfe und den Zeitaufwand.
Verstehe ich richtig das du sagst es wäre am besten wenn die anderen Programme, die Clienten/User, immer direkt mit an die Datenbank abfragen?
Wenn der MYSQL Server gut klar kommt mit einigen tausend Abfragen gleichzeitig könnte ich auch alle anderen Programme gleichzeitig, im gleichen Zyklus, eine Abfrage starten lassen zum auslessen aus der Datenbank und müsste nicht über ein Zwischenprogramm die Daten verteilen.
Zur Zeit kann ich schon mal mit meinem Programm Daten in die Datenbank schreiben und lesen, und auch mit den anderen Programmen würde es klappen. Ich frage mich aber ab wieviel Ausleseanfragen gleichzeitig es für ein MYSQL Server zu aufwendig wird.
Wenn der MYSQL Server zu schwach ist für so viele Anfragen gleichzeitig, denke ich sollte man die neuen Daten Clienten aus einer Liste, wie bei einem Newsletter, versenden. Das müsste aber in einigen Sekunden geschehen, quasi fast so schnell wie eine direkte Datenbankabfrage, wenn so ein schnelles versenden möglich ist wäre das gut, Emails kommen ja manchmal sehr verspätet an und andere Versendemöglichkeiten übers Internet kenne ich noch nicht, vielleicht kann eine selbstgeschriebene Anwendung es vollbringen. Diese Anwendung sollte dann einfach sobald es neue Daten gibt versenden an die eingetragenen User per Textdatei, diese Textdatei nur abspeichern im Ordnerpfad der vorher angegeben wird und die Anwendung sollte unter Windows Betriebssystemen laufen und wenn es geht auch auf Linux, falls es kein extra Aufwand ist.
Besten Dank für jede Hilfe und Ratschlag.
-
Nach den Vorgaben von Dir sehe ich für Dich keine Möglichkeit das überhaupt zu realisieren. Wenn du jetzt schon Probleme hast die Abfragen nicht zu schaffen dann brauchst du dir keine Gedanken machen wie es sonst geht.
Wie gesagt: Wenn es Zeitkritisch ist kommst du mit einem MySQL sowieso nicht aus.
MySQL ist schnell was abfragen betrifft. Sollte aber jemand etwas einfügen und das dauernd dann kannst du es vergessen.
SELECT geht vor INSERT bei MySQL. Erst wenn die SELECTS abgearbeitet sind kommt der INSERT/UPDATE. Da gibt es aber dann wiederrum keine SELECT da der Table gesperrt ist. MySQL kennt kein ROWLOCK wenn man MyISAM verwendet.
Du kannst natürlich auch alle Client informieren wenn etwas kommt.
Da musst du aber eine Socket aufbauen. Dies dauert eben Pro Client seine Zeit.
Somit müsstest Du mehrere parallel machen was wieder viele Threads und eine Stabile NETLEITUNG erfordert.
Solltest du aber MySQL mit Replikation (Als Select-Server) und eine stabile NETLEITUNG haben sehe ich auch kein Problem die CLients aus einem Webservice zu bedienen.
Bei der Anzahl kommt dann auch Loadbalance in Frage u.s.w.
Du kannst aber durchaus 1000 User mit einem SELECT-Server betreiben.Du siehst also das es nicht so einfach ist sowas zu machen.
EIN SELECT und INSERT ist schnell geschrieben aber es geht hier um mehr als nur SELECT und INSERT.
Du muast aber nichmal die DB abfragen. Der Webservice kann beim ersten AUfruf die Daten laden und dann vorhalten. Somit brauchst du nur eine stabilen Webserver.
-
Hi Unix-Tom,
du kennst dich wirklich gut aus. Ich werde es einmal versuchen soweit ich komme, das reinschreiben und auslesen scheint schon mal zu funktionieren bis jetzt und wegen dem Rest muss ich dann schauen wie es sich entwickelt am besten. Wenn ich hilfe brauche were ich wieer versuchen hier nach zu fragen nach angeboten. danke erst mal allen!