15/4/15 Aplicações distribuídas: interação entre partes Processamento Paralelo Middleware Orientado a Objetos Rede B Rede A Rede C Prof. João Paulo A. Almeida ([email protected]) 2015/01 - INF02799 Sistema operacional é a única infraestrutura para interação Middleware é adicionado Applications Applications Applications RMI Request reply protocol Request reply protocol External data representation External data representation Operating System Operating System Middleware layers Camadas da arquitetura (c) RPC/RMI (between computers) Applications, s ervices Network Thread 1 Thread 2 Mi ddleware User 1 OS: kernel, libraries & servers OS1 Proc esses, threads, communic ation, ... OS2 Proc esses, threads, communic ation, ... Computer & network hardware Computer & network hardware Fonte: Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edn. 4 © Pearson Education 2005 Node 1 Node 2 User 2 Kernel 1 Kernel 2 Platform Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edn. 4 © Pearson Education 2005 1 15/4/15 Aplicações distribuídas: interação entre partes Middleware Orientado a Objetos • Sistema distribuído é uma série de objetos interagindo • Baseado em protocolo de troca de mensagens invisível para o programador • O objetivo é permitir deixar objetos residirem em qualquer nó da rede para compartilhar recursos Client - Server Client – Server invocation client op (args) client result op (args) server result server proxy Object reference = reference to object interface ORB Interface specified in IDL Java RMI – Remote Method Invocation Conceitos fundamentais • Todos objetos em Java • Interfaces descritas em Java • Separação explícita de interface e implementação • Em Java: uso do construto “interface” • Terminologia: – Objeto cliente: objeto que invoca objetos remotos – Objeto remoto: objeto que pode ser acessado por objetos em outros nós (ou outra JVM) – Objeto remoto pode ser cliente de outro – Cliente: o processo que invoca métodos em objetos remotos – Servidor: processo que roda o objeto remoto • Uso de referência a objeto remoto • Esta referência tem que ser encontrada client object op (args) result Object reference = reference to object interface remote object Interface specified in Java 2 15/4/15 Distribuição de referência através de registry • Clientes obtém referências para objetos remotos através do registry que é um servidor de nomes. – Os objetos tem que conhecer o registry registry resolução client object registro / binding uso remote object Exemplo local Exemplo local c/ interface explícita /* Hello.java */ /* Hello.java */ public interface Hello { String sayHello() } /* Server.java */ public class Server implements Hello { public String sayHello() { return "Hello, world!"; } } public class Hello { public String sayHello() { return "Hello, world!"; } } /* Client.java */ public class Client { public static void main() { Hello h = new Hello(); System.out.println(h.sayHello()); } } /* Client.java */ public class Client { public static void main() { Hello h = new Server(); System.out.println(h.sayHello()); } } Criação local: quem invoca tem ref p/ obj Exemplo: Interface remota (Hello.java) /* Hello.java */ public interface Hello { String sayHello() } /* Server.java */ public class Server implements Hello { public String sayHello() { return "Hello, world!"; } } // interface para uso local apenas public interface Hello { String sayHello(); } /* Client.java */ public class Client { public static void main() { Hello h = new Server(); System.out.println(h.sayHello()); } } // interface que permite uso remoto public interface Hello extends java.rmi.Remote { String sayHello() throws java.rmi.RemoteException; } 3 15/4/15 Outro exemplo de interface que permite uso remoto (note os 2 tipos de exceções) public interface BankAccount extends java.rmi.Remote { public void deposit(float amount) throws java.rmi.RemoteException; public void withdraw(float amount) throws OverdrawnException, java.rmi.RemoteException; public float getBalance() throws java.rmi.RemoteException; } Servidor (Server.java) import java.rmi.*; // … public class Server implements Hello { public String sayHello() { return "Hello, world!"; } public static void main(String args[]) { try { Server obj = new Server(); Hello objref = (Hello) UnicastRemoteObject.exportObject(obj,2000); // Bind the remote object in the registry Registry registry = LocateRegistry.getRegistry(); // opcional: host registry.bind("Hello", objref); System.err.println("Server ready"); } catch (Exception e) { System.err.println("Server exception: " + e.toString()); e.printStackTrace(); } } } Cliente (Client.java) package example.hello; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class Client { public static void main(String[] args) { String host = (args.length < 1) ? null : args[0]; try { Registry registry = LocateRegistry.getRegistry(host); Hello stub = (Hello) registry.lookup("Hello"); String response = stub.sayHello(); System.out.println("response: " + response); } catch (Exception e) { System.err.println("Client exception: " + e.toString()); e.printStackTrace(); } }} Por debaixo dos panos Configuração de execução • Quando o cliente chama sayHello no “stub” do objeto remoto: • For example, on the Solaris(tm) Operating System: – O stub do cliente abre uma conexão com a máquina onde está rodando o servidor usando a informação no stub e serializa os parâmetros – O stub do lado do servidor aceita a conexão, envia o chamado ao objeto remoto e serializa o resultado (a string "Hello, world!") que é enviado ao cliente – O stub do cliente recebe o resultado, deserialza e retorna o resultado para o cliente – rmiregistry & • Or, on Windows platforms: – start rmiregistry Registry Name binding resolução 192.168.1.4 Servidor Cliente 192.168.1.4 (port 1099) 192.168.1.3 uso java Server java Client 192.168.1.4 4 15/4/15 Semântica das invocações Passagem de parâmetros:semântica • Para o cliente, chamadas a métodos locais são iguais a chamadas a métodos remotos. Mas: – chamadas locais: passagem de parâmetros por referência – chamadas remotas: passagem por valor se objeto convencional (copia o objeto) ou por referência se for objeto remoto • Classes que são passadas como parâmetro em Java RMI devem implementar java.io.Serializable. Isto permite que a JVM faça a serialização do estado dos objetos de forma que ele possa ser transferido através da rede. – Mudanças feitas no objeto do lado do servidor não são refle6das do lado do cliente. http://www.ime.usp.br/~kon/MAC5759/aulas/Aula10.html Medidas contra falhas Tutorial • http://java.sun.com/j2se/1.5.0/docs/guide/rmi/ hello/hello-world.html#1 Fault tolerance measures Invocation semantics Retransmit request Duplicate message filtering Re-execute procedure or retransmit reply No Not applicable Not applicable Yes No Re-execute procedure At-least-once Yes Yes Retransmit reply Maybe At-most-once Leitura p/ discussão • P.A. Bernstein. Middleware. Communications of the ACM, Vol. 39, No. 2, February 1996, 86-98. • Tragam esse texto impresso na próxima aula! 5