Entwicklung einer verteilten Anwendung #
Die Idee dieser Anwendung nun mal ein wenig besser erklärt. Informationen sollen verteilt gespeichert sein jedoch untereinander Verknüpfbar bleiben. Zudem sollen bestehende Programme wie WebBrowser u.a. nutzbar bleiben. Dafür werden Gateways benötigt, die diese Programme in das System integrieren. Weiter sollen Konzepte von Verteiltensystemen (Peer2Peer, Mobile-Agenten, ...) als Grundidee mit berücksichtigt werden.Begriffe #
- Client, ist eine Software die sich zu einem Service verbinden kann. Und den User (End-Anwender) vertritt.
- Peer, ist eine Software und zugleich ein Client, der Service bereitstellt (wie ein Server) und zugleich Service anderer Peers nutzen kann.
- Zudem sollen eingehende Anfragen zu anderen Peers weitergereicht werden sovern dieser Peer nicht in der Lage ist eine Vollständige antwort zu geben.
- Gateway, ist ein Peer der ausschließlich für das Übersetzen der Bestehenden Protokolle in das genutzte Peer Protokoll zuständig ist.
- Ein Gateway ist nicht in der Lage selbständig irgendwas zu machen, muss alle Anfragen an Peers weiterreichen.
- Ein Gateway kann/sollte mehrere Protokolle (evtl. welche die sich ähnlich sind) übersetzen können.
- Nimmt anfragen aus dem Peernetz an und sendet sie bei bedarf an die Clients weiter.
- Alle Client die mit einem Gateway reden, müssen den Peers nicht bekannt sein. Eindeutige kennungen werden bei dem Nachrichtenaustauch vergeben und müssen vom Gateway (ähnlich wie NAT) auch wieder umgesetzt werden.
- Mobile Agenten, sind Peers, die von einem System zum nächstem Wandern und Indexe bauen. Um nicht die Datenmenge sondern nur die Indexe zu transferieren. Evtl. Kann man sie zur Laufzeit mit neuen Regeln füttern.
Beispiel #
Als Beispiel soll eine Verteilte Datenbank von Zitaten dienen. Ein Peer soll anfragen (Suchen, Änderungen, ...) entgegen nehmen und im Netzwerk bereitstellen. Wird erkannt, dass ein weiterer Peer die selbe aufgabe hat. Jedoch woanders gestartet, so sollen die Datenbestände (sovern gewünscht) verteilt werden. Öffentliche Inforrmationen sollen sich bei einem Peer2Peer connect also automatisch verteilen. Wir nun ein weiterer Peer mit Buchinformationen im Netzwerk bereitgestellt, sollen Ähnlichkeiten ermittelt werde. (Muss nicht automatisch passieren) z.b. Sollen Informationen zu Authoren und Ihren Zitaten verlinkt werden. So das es möglich ist, sich zu einem Zitat auch alle Bücher(Mitwirkungen) eines Authors geben zu lassen. Diese Verbindungen müssen auf allen zuständigen Peers vertielt werden. Damit sovern ein Peer nicht mehr erreichbar ist, die Informationen dennoch verfügbar bleiben. (auch hier sind Richtliennien wie Privat, ...) zu beachten.Eine Beispieldatenbank könnte so aussehen. Cite: { *ID, author, content, date } CrossRef: { *REF, objectid } Categories: { *ID, name } reference: {*ID, *REF, type } categorie: { *CITE_ID, *CATEGORIE_ID }
Kommunikation/Protokolle #
Die Überlegung oben fordert mehrere Protokolle, jedoch nur ein Grundprotokoll welches im Peersystem verwendet wird. Als Richtlinie ist vorgesehen, dass es dem HTTP Protokoll ähnlich aufgebaut ist. Und auch Vorteile eines Zustandslosen Protokolles entsprechen sollte.PROTOKOLLNAME/VERSION PARAMETER HEADER \n DATA
Schichten #
Grundlegend kann man bestimmt diese Denkansetzte verfolgen.- Provider/Network (e.g. ServerSocket)
- Protocol (e.g. HTTP)
- Service routing (e.g. forward the request to the right peer.)
- Session (should use a token to allow switching protocol and application with no session lost)
- Handler (each Service/request will be registrated and handelt.)
Gateway #
- Client-Protokoll
- Erzeugung eindeutiger Kennung (GATEWAYNAME@CLIENTID:CLIENTPROTOKOLL) als HASH
- Übersetzen in das (Gateway) Protokoll
- Senden/Empfangen
Peer #
- Peer-Protokoll (Basis ist XML)
- Session-System
- Sync/Link Protokoll
- Routing (wenn es neue Service sind)
- Evtl. auch eigene Bearbeitung fortsetzen
- Security Layer (Token/Auth)
- Service Layer
Abfragesprache #
Abhängig vom Service können eigene Anfragesprachen entwickelt werden. Nur die Service müssen sich (sovern sie miteinander Reden wollen/müssen) absprechen.Nutzen #
Adressdatenbestände Pflegbar machen (Thunderbird und Co.) diese mit anderen Daten verbinden (Mail, PDFs, Kalendern) und die Information sinfoll merken. Und wieder Verteilen also (mutt, alpine) import oder andere Rechner mit anbinden. D.h. Mergen von Datenbeständen ...Technologien #
- Java >=1.6
- OpenJPA (in den Peers für den Datenbestand)
- xstream (XML Protokoll Erstellung/zurücklesen)
- Maven (Prjektverwaltung - 'Multi-Module')
- Thunderbird, Firefox (zum Testen)
Kommentare #
Habe die Seite gerade gesehen und wollte auch mal meinen Senf dazugeben. :-) Leider habe ich nicht so richtig verstanden, wozu Du das benötigst, vielleicht schreibst Du das noch etwas konkreter. Also erstmal eine Bemerkung zu dem Anwendungsszenario, wie ich das aus Deinem Text herauslese: Du willst eine Fortune-Datenbank über das ganze Internet verteilen. Bei normalem Peer2Peer geht es nach meinem Verständnis darum, daß man sehr große Dateien hat, die dann durch einen Hashkey identifiziert werden. Es gibt zentrale Server (ich bin kein wirklicher p2p-Freak, also berichtige mich) bzw. andere Verteilungsmechanismen, durch die ich an eine Liste komme, die die verfügbaren Hashes enthält. In jeder Zeile steht dann dazu noch einer Beschreibung der Datei wie z.B. ein Dateiname.
Wenn ich Dich richtig verstanden habe, willst Du keine Fortune-Dateien austauschen, sondern einzelne Zitate. Um das p2p-System umzusetzen, benötigst Du also eine Indexdatei, in der ein Hash für jeden Datensatz steht. Wenn Du in den Daten suchen willst (was ja der Sinn einer Datenbank ist) musst Du in der Indexdatei immer einen Hash sowie einen Suchschlüssel stehen haben. Da die Zitat-Einträge sehr kurz sind (im Vergleich zu einer Videodatei), dürfte jedoch die Indexdatei nur unwesentlich kleiner als die gesamte Datenbank sein, was das ganze sehr uneffektiv macht.
Alternativ würde man es eben nicht wie bei p2p mit einer überall verfügbaren Indexdatei machen, sondern die Abfrage durchs Netz jagen und die Ergebnisse jeweils weiterreichen oder einsammeln. Da stellt sich die Frage nach einem Timeout oder auch die Frage, ob man eine Vorabfrage startet, die die Daten schonmal vorsammelt, auf daß man dann erst später das Ergebnis abholt, wenn das Netz Zeit gehabt hat, die Lösung zu suchen. -- ThomasBayen
Jetzt mal zu einem anderen Anwendungsszenario, über das ich mir schon seit ein paar Monaten den Kopf zermartere: Ich habe in meinem Unternehmen verschiedene Quellen von Telefonnummern, die alle Ihre eigenen Daten haben. Manche dieser Quellen sind immer verfügbar, andere nicht (Handys). Manche sollten miteinander synchronisiert werden, andere nicht. Schön wäre es, wenn es ein System gäbe, diese Daten dennoch zu durchsuchen und eine Ausgabe zu erhalten, mit der man was anfangen kann. Dabei sollte am besten auch die Quelle der Daten angegeben werden können. Sagen wir mal so:
SELECT name, nummer, datasource FROM telefonbuch WHERE name LIKE 'Schmitz'
Ergebnis:
Karl Schmitz 12345 Warenwirtschaft Hubert Schmitz 4711 Warenwirtschaft Schmitz & Backes 454554 Warenwirtschaft Hilde Schmitz 2435234 Telefonbuch von Krefeld Karl Schmitz 12345 Maemo-Handy Thomas Bayen Karl Schmitz 12345 MySQL-Datenbank Telefonnummernliste Hubert Schmitz 4711 Backup Handy Außendienstler 1
Ist es sowas, was Dir da vorschwebt?!? -- ThomasBayen Noch eine allgemeine Anmerkung: Eine interessante Frage ist die nach der Anwendungs-API. Da bietet sich aus Anwendersicht natürlich SQL an, aber das will ja keiner selber implementieren. Bei MySQL kann man die Database-Engine austauschen. Sowas wäre natürlich die aller-eleganteste Lösung, weil es den kompletten Befehlsumfang von MySQL erlauben würde. (geht aber wohl nur in C). Gibt es eine Java-Datenbank (HSQLDB oder Derby oder so), die sowas erlaubt? Oder möchtest Du für Deine Anwendung gar kein SQL? -- ThomasBayen