Tuplespace programmering..en kort sammenligning for perspektivets skyld..systemmodellen i Tuplespace..gjenfinningsregler..et applikasjonseksempel Planlagt tid: 50-60 min. 1
Anders Fongen Førsteamanuensis ved Norges Informasjonsteknologiske Høgskole NITH tilbyr 9 Bachelor-programmer og 2 Master-studier Med skolesteder i Oslo, Bergen og Stavanger Tidligere jobbet 17 år i industrien programmerer. konsulent, mellomleder og arkitekt PhD fra University of Sunderland Forsker på distribuerte søkemotorer og p2p-arkitektur http://www.fongen.no 2
Distribuerte applikasjoner: Hvorfor trenger vi mellomvare? Øke flyttbarheten til programvaren (portabilitet) Tilby en programmeringsmodell gjennom et API Gjøre distribusjonen usynlig (transparens) Tilby nødvendige tilleggstjenester Adressering, synkronisering, deling, transaksjonshåndtering m.m. 3
Relatert teknologi: Remote Procedure Calls (RPC) synkron, unicast RMI, EJB, Corba, WebServices Message-Oriented Middleware (MOM) asynkron, uni-/multicast publish-and-subscribe / distributed event notification Objektorienterte databaser deling, lagring, transaksjoner Alle 3 trengs, men kan de kombineres? 4
Tuplespace delt objektlager (lager av Tupler) assosiativ gjenfinningsmodell transaksjonell beskyttelse (Atomicity-Isolation) synkronisering av gjenfinningsoperasjoner låse klienten inntil data kan leses aka Linda programming model Gjenfinningsmodell - synkroniseringsmodell 5
IBM TSpaces Kjørbar server API for klienter Gratis nedlasting for evaluering Enklere og bedre enn Sun's JavaSpaces http://www.almaden.ibm.com/cs/tspaces/ Klient Klient API API brannveggvennlig TSpaces Klient API 6
En tuple er: et ordnet sett av felt (Fields) felt kan være alle serializable objekter tag1 tag2 tag3 string object... enhet for lagring og gjenfinning Tuple t0 = new Tuple("Anders","Lisbeth",new Float(26f)); Tuplespace ts = new Tuplespace("TS98","10.21.6.96"); ts.write(t0); // Skriver til lageret 7
En mal er: en tuple med mulige joker-felt selekterer et sett av lagrede tupler paring (matching) på type og verdi Tuple tx = new Tuple("Anders", new Field(String.class), new Field(Float.class)); joker-felt 8
Gjenfinningsregler Template parameter selekterer et sett av tupler Først type, så verdi hent én, eller alle som passer konsumerer tuple, eller ikke Tuple t0 = ts.take(tx); // non-consuming: ts.read(tx) blokkerer klienten, eller ikke Tuple t0 = ts.waittotake(tx);//non-blocking: ts.take(tx) 9
Tuplespace delt, assosiativt datalager tag1 tag2 tag3 string object... tag4 tag2 tag3 string object... tag1 tag5 tag3 string object... Passer til??? tag2?????????... tag1 tag5 tag3??????... ts.write(tuple) tuple = ts.read(template) (ikke-konsumerende) tuple = ts.take(template) (konsumerende) Tuplespace take og read er ikke-blokkerende (asynkron) waittoread og waittotake er blokkerende (synkron) 10
Tuplespace (2) En Tuplespace kan brukes som delt lager Et av feltene brukes som nøkkel til tupletene read(mal) lar tupleten bli igjen i tuplespace ganske likt en oodb (f.eks. db4o) En Tuplespace kan brukes for meldingsflyt Feltene inngår i et adresseringsskjema Avsender sender tuplets med write(tuple) Mottager mottar med waittotake(mal) eller til synkronisering én-til-én, mange-til-én, mange-til-mange 11
Tuplebasert meldingsflyt Meldinger fra S til M: M leser med en mal som selekterer tupler "addressert" til M S skriver tupler i tilsvarende format Tuple melding = new Tuple("S","M","Melding"); ts.write(melding); // ts repr. tuplespace Tuple mal = new Tuple(new Field(String.class),"M", new Field(String.class)); Tuple mottatt = ts.waittotake(mal); Meldingsflyten blir bufret og synkronisert Tupledesign == protokolldesign Gjenfinningsmodell == adressesemantikk 12
Toveis meldingsflyt kan etterligne Gir synkron kall-semantikk RPC-semantikk ts.write(req) resp = ts.waittotake(mal) tuple req = ts.waittotake(mal)... ts.write(resp) tuple aktiv blokkert Klient Tjener 13
Adressesemantikk Felt brukt for adresseringsformål: kan representere roller (f.eks. printserver ) distribuert ressursstyring room service kan representere temaer ( loggmelding ) kan inngå i et typehierarki (markørklasser) Tuplespace Klient Klient webstatistikk loggmeldinger hastemeldinger Klient sikkerhetsbrudd 14
Paring på verdier i malen Når malens type passer med tuplen, skjer en paring på verdiene (om det ikke er et jokerfelt) Utnytter equals()-metoden i de respektive klassene Kan overskrive denne metoden i egne klasser for å endre semantisk innhold av likhet flerdimensjonal nærhet (GIS, Info Retrieval) bruk av synonymlister 15
Også verd å nevne: Hendelsesmetoder asynkron utføring av kode når tupler skrives eller fjernes Transaksjoner Tupler med holdbarhet fjernes automatisk etter en tid Kombinasjon av holdbarhet og hendelsesmetoder gjør én-til-mange kommunikasjon mulig 16
Fyldig eksempel distribuert tallknusing Én klient mange tjenere Klienten kjenner ikke antallet tjenere plasserer et problem i tuplespace Tjeneren kjenner ikke det aktuelle problemet henter et problem fra tuplespace opererer på et generisk grensesnitt skriver en løsning tilbake til tuplespace Tjeneren kan dele problemet i to og legge den ene halvdelen tilbake i tuplespace 17
Konfigurasjonen: Klient Tjener Tuplespace Tjener Tjener Tjenerstyrt og distribuert: - partisjonering av problemet - ressursallokering (CPU og minne) 18
Problemets grensesnitt: package no.nith.andfon.cs5023.tspc3; // An interface for a generic numeric problem. The mathematical // expression, the parameters and the sequence of parameter iterations // are hidden in the implementation. public interface NumericProblem extends java.io.serializable { // Return true of the problem is solved with the // current set of parameters boolean solved(); // Return the number of necessary iterations on the solved() method // in order to exhaust the parameter space long iterations(); // Change the parameters so that a new iteration of solve() // can be called boolean nextiteration(); // Split the "iteration space" into two objects. This object // retains one half, and the other half into the returned object NumericProblem split(); // Present a solution to the problem in string format String solution(); 19
Tjenerens kode: package no.nith.andfon.cs5023.tspc3; public class NumberCruncher implements NumberCruncherInterface { private boolean iterating = true; public static void main(string[] args) { long maxnumberofiterations = 1000; new NumberCruncher(maxNumberOfIterations); } } public NumberCruncher(long maxiterations) { SpaceWrapper sw = new SpaceWrapper(this); while (true) { // pick a task from the space NumericProblem np = sw.gettask(); // calculate the necessary number of iterations for this task long it = np.iterations(); // if it is too many, split the task in two while (it > maxiterations) { NumericProblem np2 = np.split(); // keep np, and return np2 back to the space sw.puttask(np2); it = np.iterations(); } // now iterate over this task and look for a solution while (iterating) { if (np.solved()) { // announce solution sw.putsolution(np); iterating = false; } if (!np.nextiteration()) break; } // do not fetch more tasks if a solution // has been found (by anyone) if (!iterating) return; } } //.. some code left out 20
package no.nith.andfon.cs5023.tspc3; Problemet - I: // A specific mathematical problem: Find a product's // two prime factors public class Prime implements NumericProblem { public long lo1,up1,lo2,up2; // Defines the iteration room private long x1,x2; // Working variables private long primeproduct; // Right side of the equation public Prime(long l1,long u1,long l2, long u2, long prod) { lo1 = l1; up1 = u1; lo2 = l2; up2 = u2; x1 = lo1; x2 = lo2; primeproduct = prod; } // Calculate (or predict) the number of iterations necessary // to exhaust the parameter room public long iterations() {return (up1 lo1)*(up2 lo2);} // Make the instance variables ready for the next call // to solved(). (Note: we do not ensure prime factors in this code) public boolean nextiteration() { if (x1 < up1) x1++; else if (x2 < up2) { x1 = lo1; x2++; } else { return false; } return true; } 21
Problemet - II: // Split the problem in two smaller halves by dividing // the iteration room in two public NumericProblem split() { long x; NumericProblem np; // Pick one of the two parameters at random, and divide if (Math.random() > 0.5) { x = (up1 lo1)/2 + lo1; np = new Prime(lo1,x,lo2,up2,primeProduct); lo1 = x+1; } else { x = (up2 lo2)/2 + lo2; np = new Prime(lo1,up1,lo2,x,primeProduct); lo2 = x+1; } x1 = lo1; x2 = lo2; return np; } // Check if we have found a solution with these parameters public boolean solved() { return x1 * x2 == primeproduct; } // Present the solution in string format public String solution() {return "The factors are " + x1 + " and " + x2;} } public String tostring() { return "NP: " + lo1 + " " + up1 + " " + lo2 + " " + up2 + " " + x1 + " " + x2; } 22
Klientens kode package no.nith.andfon.cs5023.tspc3; // This is the master and the conductor for the solution of the // numeric problem. It generates the first task and puts it on the // space, and then waits for the solution public class PrimeBallerina { } public static void main(string[] args) { SpaceWrapper sw = new SpaceWrapper(); sw.erasealltuples(); long primeprod = 13444; NumericProblem np = new Prime(1,10000,1,10000,primeprod); sw.puttask(np); NumericProblem np2 = sw.getsolution(); System.out.println(np2.solution()); } 23
Sekvensdiagram: Client Server Server SpaceWrapper create np:numproblem puttask(np) iterate np = gettask() puttask(np2) iterate np = gettask() puttask(np2) event putsolution(np) event 24
Idéer som jeg vil se nærmere på: Tuplespace kombinert med Codebase property: basis for mobile agenter adressesemantikk gir avanserte muligheter for å pare agent og vert tuplespace gir et medium for kommunikasjon mellom agenten og homebase, eller mellom agentene Service-orientert samarbeid (CSCW) basert på mobile ambassadører ambassadør blir en mobil "representant", mer enn en agent (som handler på mine vegne) 25
Ferdig! Takk for oppmerksomheten Noen spørsmål? Ta gjerne kontakt anders@fongen.no se også www.fongen.no der ligger denne forelesningen 26