Sisteme distribuite

46
Sisteme distribuite Continutul capitolului: Stiluri arhitecturale pentru aplicatii distribuite Tipare utilizate in realizarea infrastructurii pentru sisteme distribuite: • Client-Dispatcher-Server • Forwarder-Receiver • Remote Proxy • Broker Exemple de tehnologii de middleware care implementeaza tiparul Broker: Java RMI, CORBA, .NET Remoting

description

Sisteme distribuite. Continutul capitolului: Stiluri arhitecturale pentru aplicatii distribuite Tipare utilizate in realizarea infrastructurii pentru sisteme distribuite: Client-Dispatcher-Server Forwarder-Receiver Remote Proxy Broker - PowerPoint PPT Presentation

Transcript of Sisteme distribuite

Page 1: Sisteme distribuite

Sisteme distribuite

• Continutul capitolului:– Stiluri arhitecturale pentru aplicatii distribuite– Tipare utilizate in realizarea infrastructurii pentru

sisteme distribuite:• Client-Dispatcher-Server• Forwarder-Receiver• Remote Proxy• Broker

– Exemple de tehnologii de middleware care implementeaza tiparul Broker: Java RMI, CORBA, .NET Remoting

Page 2: Sisteme distribuite

Arhitecturi de aplicatii distribuite• Client-Server:

– Servicii distribuite, furnizate de Servere, care sunt utilizate de Clienti– Clientii sunt diferiti de Servere– Exemplu: Biblioteca online de multimedia

• N-Tiers:– Combinatie intre Layered si Client-Server– Cazul tipic: 3-Tiers: – Exemplu: Internet banking

• Peer-to-Peer:– Toti participantii sunt egali– Fiecare Peer furnizeaza unele servicii si utilizeaza alte servicii– Variante: p2p semicentralizat– Exemplu: Sistem de peer to peer filesharing

Page 3: Sisteme distribuite

Exemplu Client-Server

Catalogueserver

Librarycatalogue

Videoserver

Film clipfiles

Pictureserver

Digitisedphotographs

Web server

Film andphoto info.

Client 1 Client 2 Client 3 Client 4

Internet

[Sommerville]

Page 4: Sisteme distribuite

Exemplu 3-Tiers

Database server

Customeraccountdatabase

Web serverClient

Client

Account serviceprovision

SQLSQL query

HTTP interaction

Client

Client

[Sommerville]

Presentation Layer

Application Processing Layer

Data Management Layer

Page 5: Sisteme distribuite

Suport pentru aplicatii distribuite• Middleware:

– Infrastructura care suporta realizarea aplicatiilor distribuite

– De obicei realizata de software “off-the-shelf”

– Incercari de standardizare: CORBA

[POSA2]

Page 6: Sisteme distribuite

Rolul middleware

• Calitati dorite ale sistemelor distribuite:– Separation of concerns: logica aplicatiei sa fie separata de aspectele

legate de realizarea comunicatiei la distanta => “cineva” trebuie sa rezolve stabilirea canalului de comunicatie si eventualele transformari ale formatului datelor

– Location independence: interactiunile client-server sa se desfasoare la fel, independent de locatia serverului => “cineva” trebuie sa rezolve localizarea serverului

– Location transparence: interactiunea unui client cu un server la distanta sa aiba loc in mod similar cu un server local => “cineva” trebuie sa rezolve aducerea unei referinte la un obiect aflat la distanta

• Tipare arhitecturale pentru sisteme distribuite:– Broker– Utilizeaza si integreaza tiparele:

• Forwarder-Receiver• Client-Dispatcher-Server• Remote Proxy

Page 7: Sisteme distribuite

Client-Dispatcher-Server

Tiparul Client-Dispatcher-Server introduce o componenta intermediara = Dispatcher intre componentele clienti si servere. Rolul unui Dispatcher este de a realiza transparenta locatiei serverelor prin intermediul unui Naming Service si de a ascunde detaliile stabilirii legaturii (la distanta) intre clienti si servere.

• Exemplu: Sistemul “Achilles” de regasire a informatiilor stiintifice– Furnizorii de informatii sunt atat locali cat si la distanta– Accesarea unui furnizor de informatii se face specificand locatia

acestuia si serviciul solicitat: • de exemplu: Client trimite la serverul

“NASA/HUBBLE_TELESCOPE”, un mesaj cu continutul “HUBBLE_DOC_RECEIVE, ANDROMEDA.JPG”

Page 8: Sisteme distribuite

Exemplu Client-Dispatcher-Server

[POSA]-Fig/P.323

• Clientul nu trebuie sa cunoasca locatia serverelor pe care le foloseste

– Dispatcher: furnizeaza un Naming Service

• Codul care implementeaza functionalitatea clientului trebuie sa fie separat de codul care realizeaza conexiunea cu serverul

– Dispatcher: realizeaza stabilirea legaturii de comunicatie intre Client si Server

Page 9: Sisteme distribuite

Structura Client-Dispatcher-Server

[POSA]-Fig/P. 325

Page 10: Sisteme distribuite

Structura Client-Dispatcher-Server

[POSA]-Fig/P. 326

Page 11: Sisteme distribuite

Scenariu Client-Dispatcher-Server

[POSA]-Fig/P.327

Page 12: Sisteme distribuite

Pasi de definire a unei arhitecturi Client-Dispatcher-Server

• Separarea componentelor in clienti si servere• Stabilirea mecanismelor de comunicare necesare

– In functie de “distanta” intre clienti si servere: • In acelasi spatiu de nume• Pe aceeasi masina• In retea

• Specificarea protocoalelor de interactiune intre componente: – Protocol: specifica

• o secventa ordonata de activitati necesare pentru initializarea si pastrarea canalului de comunicatie

• Structura mesajelor/datelor care se pot transmite– CDProtocol – DSProtocol– CSProtocol

• Numirea serverelor • Proiectarea si implementarea Dispatcher

– Implementarea protocoalelor de interactiune– Gestiunea canalelor de comunicatie daca reprezinta o resursa limitata (de ex –

numarul de socket-uri ce se pot deschide)– Performanta: N Clienti, N Servere, 1 Dispatcher ! => multithreading in

implementarea Dispatcher• Implementarea Clientilor si Serverelor

Page 13: Sisteme distribuite

Varianta: Client-Dispatcher-Service

• Clientii adreseaza Servicii si nu Servere• Dispatcher-ul gaseste in repository-ul sau un server care furnizeaza

respectivul serviciu (Pot fi mai multe servere care furnizeaza acel serviciu)

• Exemplu: urmatorul exemplu simplu ilustreaza realizarea unui asemenea Naming Service, pentru un sistem simplificat in care Dispatcher, Clientii si Services ruleaza toti in acelasi spatiu de nume

• Cod complet -> vezi ClientDispatcherServer.jsl

Page 14: Sisteme distribuite

Exemplu: Implementare Dispatcher

class Dispatcher {Hashtable registry = new Hashtable();Random rnd = new Random(12345);

public void register(String svc, Service obj) {Vector v = (Vector)registry.get(svc);if (v == null) {

v = new Vector();registry.put(svc, v);

}v.addElement(obj);

}public Service locate(String svc) throws NotFound {

Vector v = (Vector)registry.get(svc);if (v == null) throw new NotFound();if (v.size() == 0) throw new NotFound();int i = rnd.nextInt() % v.size();return (Service)v.elementAt(i);

}}

Page 15: Sisteme distribuite

Exemplu: Implementare Service

abstract class Service {String nameOfService;String nameOfServer;public Service(String svc, String srv) {

nameOfService = svc;nameOfServer = srv;CDS.disp.register(nameOfService, this);

}abstract public void service();

}

class PrintService extends Service {public PrintService(String svc, String srv) {

super(svc, srv);}public void service() {

System.out.println("Service " + nameOfService + " by " + nameOfServer);}

}

Presupune cazul particular in care D-S sunt in acelasi spatiu de nume, caz in care D poate fi realizat de un Singleton.

Altfel protocolul S-D este mai complicat de implementat (D va trebui sa existe ca serviciu care ruleaza la o adresa prestabilita si cunoscuta de toate partile)

Page 16: Sisteme distribuite

Exemplu: Implementare Client

class Client { public void doTask() {

Service s;try {

s = CDS.disp.locate("printSvc");s.service();

} catch (NotFound n) {System.out.println("Service not available");

}try {

s = CDS.disp.locate("printSvc");s.service();

} catch (NotFound n) {System.out.println("Service not available");

}try {

s = CDS.disp.locate("drawSvc");s.service();

} catch (NotFound n) {System.out.println("Service not available");

} }}

Presupune cazul particular in care C-D sunt in acelasi spatiu de nume, caz in care D poate fi realizat de un Singleton.

Presupune cazul particular in care C-S ruleaza in acelasi spatiu de nume

Page 17: Sisteme distribuite

Exemplu:Inregistrare servicii, client

public class CDS{

public static Dispatcher disp = new Dispatcher();public static void main(String[] args){

Service s1 = new PrintService("printSvc", "srv1");Service s2 = new PrintService("printSvc", "srv2");Client client = new Client();client.doTask();

}}

Page 18: Sisteme distribuite

Proprietati ale tiparului Client-Dispatcher-Server

• Avantaje:– Exchangeability of servers– Location and migration transparency– Re-configuration– Fault-tolerance

• Atentionari:– Lower efficiency: performanta este determinata de overhead-ul

introdus de dispatcher (1 singur Dispatcher la N Clienti si M Servere)

• Localizarea serverelor• Inregistrarea serverelor• Stabilirea conexiunilor

– Nu incapsuleaza detaliile infrastructurii de comunicatie (vezi pe diagrama de colaborari cate operatii diferite traverseaza limitele proceselor !) => e nevoie de alt pattern mai bun din acest punct de vedere: Forwarder-Receiver

Page 19: Sisteme distribuite

Forwarder-Receiver

Tiparul Forwarder-Receiver realizeaza transparenta comunicatiilor inter-procese pentru sisteme care interactioneaza dupa un model peer-to-peer. Tiparul introduce elementele Forwarder si Receiver pentru a decupla functionalitatea fiecarui peer de mecanismul de comunicare utilizat.

Peer1 Peer2

How are you ?

I am alive !

Page 20: Sisteme distribuite

Exemplu Forwarder-Receiver

class Peer1 extends Thread {Receiver r;Forwarder f;public void run() {

f = new Forwarder("Peer1");Message msg = new Message

("Peer1", "How are you");

f.sendMsg("Peer2", msg);

Message result = null;r = new Receiver("Peer1");result = r.receiveMsg();System.out.println("Peer1

receptionat mesaj " + result.data + " de la " + result.sender);}

}

class Peer2 extends Thread {Receiver r;Forwarder f;public void run() {

Message result = null;r = new Receiver("Peer2");result = r.receiveMsg();System.out.println("Peer2

receptionat mesaj "+result.data+" de la "+result.sender);

f = new Forwarder("Peer2");Message msg = new Message

("Peer2", "I am alive");

f.sendMsg(result.sender, msg);}

}

Problema:• Un Peer nu trebuie sa cunoasca mecanismul de comunicare intre procese utilizat la

baza• Solutia trebuie sa permita schimbarea mecanismului de comunicare, fara a afecta

functionalitatea Peers• Fiecare Peer cunoaste doar numele altui Peer cu care comunica

Page 21: Sisteme distribuite

Structura Forwarder Receiver

[POSA]-Fig/P.310

Page 22: Sisteme distribuite

Structura Forwarder-Receiver

[POSA]-Fig/P.311

Page 23: Sisteme distribuite

Scenariu Forwarder-Receiver

[POSA]-Fig/P.312

Page 24: Sisteme distribuite

Exemplu implementare

Peer1 Peer2

deliver ( marshal ( How are you ) unmarshal ) receive

Registry

F

R

R

F

Config.db“Peer1”: adresa …“Peer2”: adresa …

receive ( unmarshal ( I am alive ) marshal ) deliver

Page 25: Sisteme distribuite

Pasi implementare tipar Forwarder-Receiver

• Specificarea maparii nume – adrese• Specificarea protocolului de comunicatie intre

peers si intre Peers si Forwarders/Receivers: sendMsg, receiveMsg

• Alegerea mecanismului de comunicatie• Implementare Forwarder: deliver, marshal• Implementare Receiver: receive, unmarshal• Implementare Peers• Implementare configuratie de start

Page 26: Sisteme distribuite

Pas1: Specificarea maparii nume-adrese

class Entry {private String destinationId;private int portNr;public Entry(String theDest, int thePort) {

destinationId = theDest;portNr = thePort;

}public String dest() {

return destinationId;}public int port() {

return portNr;}

}

theKey: numele sub care este cunoscut serviciul ( de exemplu Peer1, Peer2)

theDest, thePort: adresa IP+nr port

public class Registry{

private Hashtable hTable = new Hashtable(); private static Registry _instance=null; private Registry(){} public static Registry instance() { if (_instance==null) _instance=new Registry(); return _instance; }

public void put(String theKey, Entry theEntry) {hTable.put(theKey, theEntry);

}public Entry get(String aKey) {

return (Entry)hTable.get(aKey);}

}

Page 27: Sisteme distribuite

Pas2: Specificarea protocolului de comunicatie pentru Peers

class Message{

public String sender;public String data;public Message(String theSender, String rawData){

sender = theSender;data = rawData;

}}

class Forwarder{…public void sendMsg(String theDest,

Message theMsg){

deliver(theDest, marshal(theMsg));}

}

class Receiver{…public Message receiveMsg()

{return unmarshal(receive());

}}

Page 28: Sisteme distribuite

Pas3: Alegerea protocolului de comunicatie

class Forwarder { private Socket s; private OutputStream oStr;

… private void deliver(String theDest, byte[] data) { try {

Entry entry = Registry.instance().get(theDest);if (entry == null) { System.out.println(“Dest unknown"); return; }s = new Socket(entry.dest(), entry.port());oStr = s.getOutputStream();oStr.write(data);oStr.flush();oStr.close();} catch (IOException e) {

System.out.println("IOE forwarder"); } }

}…}

class Receiver { private ServerSocket srvS; private Socket s; private InputStream iStr;

… private byte[] receive() {

int val;byte buffer[] = null;try { Entry entry = Registry.instance().get(myName); srvS = new ServerSocket(entry.port(), 1000); s = srvS.accept(); iStr = s.getInputStream(); val=iStr.read(); buffer=new byte[val]; iStr.read(buffer); iStr.close(); s.close(); srvS.close(); } catch (IOException e) {

System.out.println("IOE receiver"); } return buffer;}

…}

Page 29: Sisteme distribuite

Pas4: Implementare Forwarder/Receiver class Forwarder { …

private byte[] marshal(Message theMsg) {String m = " "+theMsg.sender + ":" + theMsg.data;byte b[]=new byte[ m.get_Length()];b = m.getBytes();b[0]=(byte)m.get_Length();return b;

}…}

class Receiver { … private Message unmarshal(byte[] anArray) {

String msg=new String(anArray);String sender = msg.substring(1, msg.IndexOf(':'));String m = msg.substring(msg.IndexOf(':')+1, msg.get_Length());return new Message(sender, m);

} …}

Page 30: Sisteme distribuite

Pas 5: Realizare configuratie de start

class Configuration {public Configuration(){ Entry entry=new Entry("127.0.0.1", 1111); Registry.instance().put("Peer2", entry); entry=new Entry("127.0.0.1", 2222); Registry.instance().put("Peer1", entry);

}}

public class P1 {public static void main(String args[]) {

new Configuration();Peer1 p1=new Peer1();p1.start();}

}

public class P2 {public static void main(String args[]) {

new Configuration();Peer2 p2=new Peer2();p2.start();}

}

Adresele date ca exemplu reprezinta cazul particular in care componentele comunicante sunt pe acelasi calculator – localhost – identificat prin adresa IP de loopback 127.0.0.1

Page 31: Sisteme distribuite

Proprietati ale tiparului Forwarder-Receiver

• Avantaje:– Comunicare eficienta inter-procese– Incapsulare a facilitatilor de comunicare inter-

procese

• Atentionari:– Nu suporta reconfigurarea flexibila a

componentelor => combinatie cu dispatcher

Page 32: Sisteme distribuite

Remote Proxy

Tiparul Proxy permite clientilor unei componente sa comunice cu un “reprezentant” al acesteia, in loc de a comunica cu originalul.

Remote Proxy: permite clientilor unei componente la distanta sa un acces transparent la aceasta, ascunzand clientilor aspectele ce tin de adresarea si comunicarea la distanta

Page 33: Sisteme distribuite

Structura generala Proxy

[POSA]-Fig/P.

Page 34: Sisteme distribuite

Scenariul general Proxy

marshal, deliver

unmarshal, receive

Remote Proxy: pre si postprocesarea este facuta in combinatie cu tiparul Forwarder-Receiver

[POSA]-Fig/P.

Page 35: Sisteme distribuite

Broker

Tiparul Broker structureaza sisteme distribuite constand din componente decuplate care interactioneaza prin invocarea de servicii la distanta. Broker-ul realizeaza coordonarea comunicarii si ascunderea detaliilor comunicarii fata de

componentele implicate.

Invoke foo on

Object X

Invoke bar on

Object Yfoo bar

Object X Object Y

Server1 Server2Client1 Client2

Broker

Page 36: Sisteme distribuite

Broker vs Forwarder-Receiver

• Ambele tipare realizeaza coordonarea comunicarii si ascunderea detaliilor comunicarii fata de componentele implicate

• Forwarder-Receiver: comunicarea are loc prin mesaje al caror format este stabilit si cunoscut de componentele Peer care participa

• Broker: componentele interactioneaza prin invocare de servicii la distanta (invocare de operatii exportate de o interfata), in mod transparent fata de locatia componentelor.– Realizarea tiparului Broker presupune integrarea unui tipar Remote

Proxy cu tiparul Forwarder-Receiver

Page 37: Sisteme distribuite

[POSA]-Fig/P. 103-105

Page 38: Sisteme distribuite

Broker

[POSA]-Fig/P.107

Page 39: Sisteme distribuite

Serverul se inregistreaza la Broker

[POSA]-Fig/P.108

Page 40: Sisteme distribuite

Brokerul rezolva o cerere Client-Server

[POSA]-Fig/P.109

Page 41: Sisteme distribuite

Variante de Broker

• Indirect Broker: – realizeaza o comunicatie indirecta intre client si server: orice

comunicatie intre client si server este transmisa prin intermediul Broker-ului

– Corespunde cu varianta prezentata in scenariul general din diagrama de colaborari anterioara

• Direct Broker:– Clientul poate comunica direct cu Server-ul, dupa ce conexiunea

a fost realizata prin intermediul Broker => creste eficienta comunicatiei

– Operatiile descrise in diagrama anterioara raman valabile ca principiu si secventa dar sunt rearondate intre Proxy-uri si Broker: Proxy-urile vor prelua operatiile forward_request si forward_response de la Broker

Page 42: Sisteme distribuite

Interactiunea intre diferiti Brokeri

[POSA]-Fig/P.110

Page 43: Sisteme distribuite

Implementari de referinta ale arhitecturii Broker

Middleware care implementeaza tiparul Broker: – CORBA: Common Object Request Broker

Architecture. Arhitectura de referinta elaborata de OMG (Object Management Group)

• Diverse implementari, comerciale sau open

– RMI: Java Remote Method Invocation - Sun– .NET Remoting - Microsoft

Page 44: Sisteme distribuite

Arhitectura RMI

Client Remote Interface

Remote Object

Stub(ClientSide Proxy)

Skeleton(ServerSide Proxy)

Remote Reference Layer

TransportLayer

uses implements

implementsServer

Page 45: Sisteme distribuite

Arhitectura CORBA

ClientRemote Interface

IDL

Remote Object

IDL Stub(ClientSide

Proxy)

IDL Skeleton(ServerSide

Proxy)

ORB (Object Request Broker)

Server

DynamicInvocationInterface

ObjectAdapter

InterfaceRepository

ImplemRepository

ORB Interface

Page 46: Sisteme distribuite

.NET Remoting Architecture

Client Remote Interface

Remote Object

TransparentProxyRealProxy

Remoting system Remoting system

Server

Channel