Platz schaffen für JavaSpaces, Teil 1

Dieser Artikel beginnt einen zweiten Thread der Jiniology- Reihe. Im Juni startete Bill Venners Jiniology mit einem Überblick über die Jini-Technologie - eine leistungsstarke neue Infrastruktur zum Erstellen und Bereitstellen verteilter Systeme, die als Serviceverbände organisiert sind. Dieser Thread, der alle zwei Monate in dieser Spalte vorgestellt wird, konzentriert sich auf JavaSpaces,Ein zentraler Jini-Service von Sun Microsystems, der eine umfassende Möglichkeit zum Erstellen kollaborativer und verteilter Anwendungen bietet. Wenn Sie Anwendungen mit Jini erstellen, möchten Sie wissen, wie Sie mit JavaSpaces die Teilnehmer in einem Jini-Verbund koordinieren. Beachten Sie jedoch auch, dass Sie JavaSpaces separat von Jini verwenden können, um allgemeine verteilte Systeme in Java zu erstellen. In beiden Fällen ist JavaSpaces einen Blick wert, da es das Design und die Codierung verteilter Anwendungen erheblich vereinfachen kann.

Platz schaffen für JavaSpaces: Lesen Sie die ganze Serie!

  • Teil 1. Einfache Entwicklung verteilter Apps mit JavaSpaces
  • Teil 2. Erstellen Sie einen Computerserver mit JavaSpaces
  • Teil 3. Koordinieren Sie Ihre Jini-Apps mit JavaSpaces
  • Teil 4. Untersuchen Sie Jini-Transaktionen mit JavaSpaces
  • Teil 5. Machen Sie Ihren Computerserver robust und skalierbar

In dieser Reihe stellen wir Ihnen zunächst das einzigartige JavaSpaces-Programmiermodell vor, das sich deutlich von anderen Netzwerk- und verteilten Tools unterscheidet, mit denen Sie möglicherweise vertraut sind. In den folgenden Artikeln werden wir die Details der JavaSpaces-API und deren Verwendung zum Zusammenfügen von Prozessen in eine verteilte Anwendung behandeln und beschreiben, wie JavaSpaces mit anderen Komponenten von Jini interagiert. Während der gesamten Serie werden Sie feststellen, dass JavaSpaces einfach (die API besteht nur aus einer Handvoll Operationen), ausdrucksstark (eine große Anzahl von Problemen kann mit JavaSpaces gelöst werden) und leistungsstark (Sie können anspruchsvolle verteilte Systeme mit kleinen Mengen erstellen) ist von JavaSpaces-Code).

Lass uns anfangen.

Ein neues verteiltes Rechenmodell

Das Erstellen verteilter Anwendungen mit herkömmlichen Netzwerktools umfasst normalerweise das Weiterleiten von Nachrichten zwischen Prozessen oder das Aufrufen von Methoden für entfernte Objekte. Im Gegensatz dazu kommunizieren Prozesse in JavaSpaces-Anwendungen nicht direkt, sondern koordinieren ihre Aktivitäten, indem sie Objekte über einen Space oder einen gemeinsam genutzten Speicher austauschen . Ein Prozess kann writeneue Objekte in einen Raum, takeObjekte aus einem Raum oderreadObjekte in einem Raum erstellen; Abbildung 1 zeigt mehrere Prozesse (dargestellt durch Herzöge), die mit diesen Operationen mit Räumen interagieren. Beim Aufnehmen oder Lesen von Objekten verwenden Prozesse eine einfache Zuordnung basierend auf den Werten von Feldern, um die für sie wichtigen Objekte zu finden. Wenn ein passendes Objekt nicht sofort gefunden wird, kann ein Prozess warten, bis eines eintrifft. In JavaSpaces ändern Prozesse im Gegensatz zu herkömmlichen Objektspeichern keine Objekte im Raum oder rufen ihre Methoden direkt auf - während Objekte dort nur passive Daten sind. Um ein Objekt zu ändern, muss ein Prozess es explizit entfernen, aktualisieren und erneut in den Bereich einfügen.

Spaces sind Objektspeicher mit mehreren wichtigen Eigenschaften, die dazu beitragen, JavaSpaces zu einem leistungsstarken und ausdrucksstarken Tool zu machen. Lasst uns genauer hinschauen:

  • Bereiche werden gemeinsam genutzt: Viele Remote-Prozesse können gleichzeitig mit einem Bereich interagieren. Der Bereich selbst verwaltet die Details des gleichzeitigen Zugriffs, sodass Sie sich auf das Design der Protokolle auf hoher Ebene zwischen Ihren Prozessen konzentrieren können.

  • Leerzeichen sind dauerhaft: Leerzeichen bieten zuverlässige Speicherung für Objekte. Wenn Sie ein Objekt in einem Raum speichern, bleibt es dort auf unbestimmte Zeit, bis es entfernt wird. Sie können auch eine Lease-Zeit anfordern, während der ein Objekt gespeichert werden soll. Sobald ein Objekt im Speicherplatz gespeichert ist, bleibt es dort, bis seine Lease-Zeit (die erneuert werden kann) abgelaufen ist oder bis ein Prozess es explizit entfernt. Wir werden Mietverträge später in dieser Reihe ausführlicher besprechen.

  • Leerzeichen sind assoziativ: Objekte in einem Leerzeichen werden über die assoziative Suche lokalisiert , nicht nach Speicherort oder Kennung. Die assoziative Suche bietet eine einfache Möglichkeit, die Objekte, an denen Sie interessiert sind, anhand ihres Inhalts zu finden, ohne wissen zu müssen, wie das Objekt heißt, wer es erstellt hat oder wo es gespeichert ist. Um ein Objekt nachzuschlagen, erstellen Sie eine Vorlage (ein Objekt, bei dem einige oder alle Felder auf bestimmte Werte festgelegt sind und die anderen nullals Platzhalter fungieren). Ein Objekt im Bereich entspricht einer Vorlage, wenn es genau mit den angegebenen Feldern der Vorlage übereinstimmt. Sie werden sehen, dass Sie mit der assoziativen Suche Abfragen für Objekte wie "Gibt es Aufgaben, die berechnet werden müssen?" Leicht ausdrücken können. oder "Gibt es Antworten auf den Hauptfaktor, nach dem ich gefragt habe? "

  • Leerzeichen sind transaktionssicher: JavaSpaces verwendet den Transaktionsdienst von Jini, um sicherzustellen, dass eine Operation auf einem Leerzeichen atomar ist (entweder wird die Operation angewendet oder nicht). Transaktionen werden für einzelne Vorgänge in einem einzelnen Bereich sowie für mehrere Vorgänge in einem oder mehreren Bereichen unterstützt (entweder werden alle Vorgänge angewendet oder keine). Wie Sie später in der Serie sehen werden, sind Transaktionen ein wichtiger Weg, um mit teilweisen Fehlern umzugehen.

  • Mit Leerzeichen können Sie ausführbaren Inhalt austauschen: In einem Bereich sind Objekte nur passive Daten - Sie können sie nicht ändern oder ihre Methoden aufrufen. Wenn Sie jedoch ein Objekt lesen oder aus einem Bereich entnehmen, wird eine lokale Kopie des Objekts erstellt. Wie bei jedem anderen lokalen Objekt können Sie seine öffentlichen Felder ändern und seine Methoden aufrufen, auch wenn Sie noch nie ein Objekt wie dieses gesehen haben. Diese Funktion bietet Ihnen einen leistungsstarken Mechanismus zum Erweitern des Verhaltens Ihrer Anwendungen durch einen Bereich.

Im Verlauf dieser Serie zeigen wir Ihnen, wie diese Eigenschaften eine wichtige Rolle dabei spielen, verteilte Anwendungen zu erstellen, die in der Jini-Umgebung gut funktionieren, in der die Vernetzung häufig spontan erfolgt und Prozesse die Berechnung dynamisch verbinden und verlassen, manchmal aufgrund von Geräten oder Geräten Netzwerkfehler.

Ursprünge von JavaSpaces

Wir haben JavaSpaces als neues verteiltes Computermodell beschrieben, dessen Ursprünge jedoch auf die Yale University in den frühen 1980er Jahren zurückgehen. Dort entwickelte Dr. David Gelernter ein Tool namens Linda zum Erstellen verteilter Anwendungen. Linda besteht aus einer kleinen Anzahl von Vorgängen in Kombination mit einem dauerhaften Speicher, der als Tupelbereich bezeichnet wird. Diese Operationen sind orthogonal zu einer bestimmten Programmiersprache. Sie sind Teil einer Koordinationssprache , die zu jeder anderen Berechnungssprache hinzugefügt werden kann .Das Ergebnis der Linda-Forschung war überraschend: Durch die Verwendung eines Objektspeichers zusammen mit einer kleinen Anzahl einfacher Operationen können Sie eine große Klasse paralleler und verteilter Probleme mithilfe von Techniken implementieren, die viele der Fallstricke beim Aufbau vernetzter Systeme verringern. Mit anderen Worten, weltraumgestützte Systeme sind nicht nur einfach (erfordern nur wenige Operationen), sondern auch ausdrucksstark (eignen sich gut zur Lösung vieler verteilter Probleme).

Dr. Gelernters Arbeit inspirierte den JavaSpaces-Service von Sun und beeinflusste auch das Design der Lookup- und Discovery-Komponenten der Jini-Kerntechnologie (die Sie im Verlauf der Jiniology- Reihe sehen werden). Während JavaSpaces das Weltraummodell von Linda geerbt hat, haben die Designer von JavaSpaces das Modell in erheblichem Maße aktualisiert und dabei die Leistungsfähigkeit von Java-Objekten, Jini, RMI und Objektserialisierung genutzt.

JavaSpaces im Kontext

Unsere Beschreibung war bisher ein wenig abstrakt. Betrachten wir einige Beispiele für real verteilte Anwendungen, die Sie als Prozesse modellieren können, die Objekte durch Räume austauschen.

Chat-Systeme

Stellen Sie sich ein einfaches Mehrbenutzer-Chat-System vor, in dem ein Bereich als Chat-Bereich dient, in dem alle Nachrichten enthalten sind, aus denen eine Diskussion besteht. Zum Sprechen legt ein Teilnehmer Nachrichtenobjekte im Raum ab. Alle Chat-Mitglieder warten darauf, dass neue Nachrichtenobjekte angezeigt werden, lesen sie und zeigen ihren Inhalt an. Verspätete Ankünfte können die vorhandenen Nachrichtenobjekte im Bereich untersuchen, um die vorherige Diskussion zu überprüfen. Da der Platz dauerhaft ist, kann ein neuer Teilnehmer die Diskussion lange nach dem Verschwinden aller anderen Teilnehmer anzeigen, und die Teilnehmer können sogar viel später zurückkehren, um das Gespräch dort aufzunehmen, wo sie aufgehört haben. Die Liste der Chat-Teilnehmer kann auch im Bereich aufbewahrt und aktualisiert werden, wenn jemand an der Konversation teilnimmt oder diese verlässt.

Rechenserver

Betrachten Sie nun die Analyse von Echtzeit-Radioteleskopdaten auf Anzeichen von außerirdischem Leben (ähnlich wie beim SETI @ home-Projekt). Solche Daten sind umfangreich und ihre Analyse ist eine rechenintensive Aufgabe, die sich gut für die parallele Berechnung durch ein Computernetzwerk eignet - mit anderen Worten als "Computerserver". Mithilfe der JavaSpaces-Technologie wird eine Reihe von Aufgaben - beispielsweise eine Aufgabe pro Datenblock, der analysiert werden muss - in den Space geschrieben. Jeder teilnehmende Computer durchsucht den Speicherplatz nach einer Aufgabe, entfernt ihn, schließt die erforderliche Rechenarbeit ab, legt das Ergebnis wieder im Speicherbereich ab und sucht dann weiter nach weiteren Aufgaben. Dieser Ansatz lässt sich natürlich skalieren: Er funktioniert genauso, unabhängig davon, ob 10 oder 1.000 Computer verfügbar sind. Der Ansatz bietet auch einen natürlichen Lastausgleich. da jeder Mitarbeiter genau so viel Arbeit aufnimmt, wie er in einer bestimmten Zeit erledigen kann, wobei langsame Computer weniger und schnelle Computer mehr erledigen.

Maklersysteme

Betrachten Sie als drittes Beispiel ein Online-Auktionssystem, das Käufer und Verkäufer von Waren und Dienstleistungen zusammenbringt. Angenommen, Sie als potenzieller Käufer beschreiben den Artikel (z. B. ein Auto), den Sie kaufen möchten, und den Preis, den Sie zu zahlen bereit sind, wickeln die Informationen in einen Eintrag ein und schreiben den resultierenden Kaufeintrag zu einem Raum. Gleichzeitig überwachen potenzielle Verkäufer kontinuierlich den Platz für das Eintreffen von Kaufeinträgen, die mit Artikeln in ihrem Inventar übereinstimmen. Beispielsweise überwachen Mazda-Händler den Platz für Einträge, die Mazdas beschreiben, während Gebrauchtwagenhändler den Platz für alle Gebrauchtwagenanfragen überwachen. Wenn eine übereinstimmende Anfrage gefunden und gelesen wird, schreibt ein potenzieller Verkäufer einen Gebotseintrag in den Bereich und gibt einen Angebotspreis an. Als potenzieller Käufer überwachen Sie kontinuierlich den Platz für Gebote für Ihre ausstehenden Anfragen.Wenn Sie eines finden, das akzeptabel ist, entfernen Sie die Gebote und kontaktieren den Verkäufer (möglicherweise über einen anderen Eintrag durch den Raum).

Ein kurzer Überblick über die API

Jetzt ist es Zeit, die JavaSpaces-API einzuführen. Wie wir bereits gesagt haben, ist es einfach; Tatsächlich werden wir im Rest dieses Artikels alles behandeln, was Sie darüber wissen müssen (abgesehen von einigen kleinen Details). Bevor wir jedoch die JavaSpaceSchnittstelle und ihre Methoden beschreiben, müssen wir zunächst über Einträge sprechen.

Einträge

Ein Objekt, das in einem Raum gespeichert ist, wird als bezeichnet

Eintrag.

Um ein Eintrag zu sein, muss ein Objekt nur das implementieren

Entry

Schnittstelle. Definieren wir als Beispiel einen Nachrichteneintrag, den Sie in ein Leerzeichen schreiben können:

import net.jini.core.entry.Entry;

public class Message implementiert Entry {public String content;

// ein Konstruktor ohne Argumente public Message () {}}

Hier haben wir eine MessageKlasse mit einem Zeichenfolgenfeld definiert, das den Inhalt der Nachricht enthält. Da wir diese Klasse mit Leerzeichen verwenden möchten, müssen wir die Schnittstelle implementieren net.jini.core.entry.Entry, die im Paket enthalten ist net.jini.core.entry. Es ist wichtig darauf hinzuweisen, dass Entryes sich um eine Markierungsschnittstelle handelt. Mit anderen Worten, die Schnittstelle enthält keine Konstanten oder Methoden und erfordert daher keine besondere Arbeit zur Implementierung, außer das Hinzufügen implements Entryzu Ihrer Klassendefinition.

Neben der Implementierung der EntrySchnittstelle gibt es einige andere Konventionen, denen unsere Einträge folgen müssen. Wir werden in späteren Artikeln mehr über die Gründe zu sagen haben, aber im Moment werden wir uns nur die Grundzüge ansehen. Ein Eintrag muss einen öffentlichen Konstruktor haben, der keine Argumente akzeptiert (einen sogenannten No-Arg- Konstruktor). Diese Anforderung ergibt sich aus der zugrunde liegenden Serialisierung, die auftritt, wenn Einträge in und aus Leerzeichen übertragen werden. Beachten Sie, dass unsere Definition von Messageeinen Konstruktor ohne Argumente enthält. Eine andere Konvention ist, dass Felder eines Eintrags deklariert werden solltenpublic;; Auf diese Weise können andere Prozesse Ihre Einträge in Räumen über eine assoziative Suche finden, die auf den Werten dieser Felder basiert. Eine dritte Konvention besteht darin, dass Felder eines Eintrags Verweise auf Objekte und nicht auf primitive Typen enthalten müssen (dh, wenn Sie ein primitives Typfeld definieren müssen, z. B. intsollten Sie Integerstattdessen die entsprechende Wrapper-Klasse verwenden). Um sicherzustellen, dass Sie alle Ihre Grundlagen beim Definieren von Einträgen abdecken, empfehlen wir, dass Sie sich für Einzelheiten auf JavaSpaces-Prinzipien, -Muster und -Praxis oder auf die JavaSpaces-Spezifikation von Sun Microsystems beziehen . Wie bereits erwähnt, werden wir in späteren Artikeln auch einige der Feinheiten ansprechen.

Abgesehen von diesen Anforderungen ist ein Eintrag wie jede andere Java-Klasse. Sie können es instanziieren, seine Methoden aufrufen und seinen öffentlichen Feldern Werte zuweisen. Nachdem wir eine MessageEintragsklasse definiert haben , wollen wir sehen, welche Operationen für die Interaktion mit Einträgen in Leerzeichen verfügbar sind.

Die JavaSpace-Schnittstelle

Um mit einem Space zu interagieren, müssen Sie Zugriff auf ein Objekt erhalten, das die JavaSpaceSchnittstelle implementiert . Es gibt viele Möglichkeiten, auf ein solches Objekt zuzugreifen (Sie können beispielsweise die Jini-Suche oder die RMI-Registrierung verwenden), und wir werden die Details dazu im nächsten Artikel behandeln. Im Moment konzentrieren wir uns auf die JavaSpaceSchnittstelle selbst.