jpalmeida-pp-2015-01-aula04[rmi]

Propaganda
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
Download