Objetos Distribuídos
Nazareno Andrade
O Problema
Orientação a objetos é um paradigma poderoso Modularidade, extensibilidade, manutenibilidade
Porque distribuir os objetos: Localidade dos objetos Tolerância a falhas Performance
Como estender o modelo OO para sistemas distribuídos? Referências, invocações de métodos, erros, ...
O Modelo
Um Objeto Remoto é aquele que pode receber uma invocação remota (RMI) Referências remotas Interfaces remotas
invocation invocationremote
invocationremote
locallocal
local
invocation
invocationA B
C
D
E
F
Referências e Interfaces Remotas
Referências remotas Identificador único para um
objeto no sistema distribuído
Transparência de localidade para o cliente
Interfaces remotas Definem os métodos de um
objeto que podem receber invocações remotas
Linguagem de definição de interface (IDL)
m2
m1
m2
m1
m3
Interface remota
A
C
L
Semântica de Invocações remotas
Invocações locais são executadas exatamente uma vez
Isso não é possível em Objetos Distribuídos Falhas
Outras semânticas: talvez, pelo menos uma vez, no máximo uma vez
Mais sobre semânticas
Mecanismo de tolerância a falhas
SemânticaRetransmissão
de requestFiltro de
duplicatas
Re-execução do método ou retransmissão
do reply
Não --- ---
Sim NãoRe-execução do método
Sim SimRetransmissão
do reply
Mais sobre semânticas
Mecanismo de tolerância a falhas
SemânticaRetransmissão
de requestFiltro de
duplicatas
Re-execução do método ou retransmissão
do reply
Não --- --- Talvez
Sim NãoRe-execução do método
No mínimo uma vez
Sim SimRetransmissão
do replyNo máximo
uma vez
RMI e transparência
100% de transparência é impossível Falhas de comunicação RMIs possuem exceções intrínsecas
Transparência pode não ser desejada Explorar diferentes semânticas Cancelamento de requisições
Um exemplo: Quadro negro distribuído
Clientes compartilham um quadro negro Todos podem adicionar e modificar figuras Todos se mantém atualizados via polling
DrawingBoard, Shape e GraphicalObject
DrBd
shapeshape
Cliente
getState, setState
createShape, getAllShapes
Tecnologias
Java RMI Java apenas Integração com a linguagem
.Net remoting Solução proprietária da Microsoft Integrada com a linguagem
CORBA Independente de linguagem Diferentes implementações
Exemplo: Java RMIimport java.rmi.*;
public interface DrawingBoard extends Remote {Shape createShape(GraphicalObject g) throws RemoteException;
List getAllShapes() throws RemoteException;}
public interface Shape extends Remote {GraphicalObject getState() throws RemoteException;
void setState(GraphicalObject g) throws RemoteException}
public class DrawingBoardServer extends UnicastRemoteObject implements DrawingBoard {...}
Exemplo: CORBA
interface DrawingBoard {Shape createShape(in GraphicalObject g);All getAllShapes();
}
Typedef sequence<Shape, 100> All;
interface Shape {GraphicalObject getState();void setState(in GraphicalObject g)
}
struct GraphicalObject { ... }
Serialização x Referência Remota
Objetos não-remotos são passados por cópia
Objetos remotos têm uma referência remota passada
shape
ClienteDrBd
getAllShapes
referência remota
GraphicalObject
setState
cópia serializada
Ref remotapara shape
Até agora...
Porque Objetos Distribuídos Conceitos Básicos Tecnologia Exemplo
Arquitetura de um sistema de Objetos Distribuídos
Limitações e alternativas Conclusões
Request
Reply
cliente servidor
CS
Módulo decomunicação
Módulo decomunicação
Módulo de Ref. remota
Módulo de Ref. remota
Skeleton eDispatcher da
classe de B
Arquitetura de um Sistema de Objetos Distribuídos
Proxy p/ B
B
• Implementa o protocolo de reply response
Skeleton:• Implementa métodos da interface remota• Desserializa requests e serializa replysDispatcher:
• Recebe msgs do módulo de comunicação e invoca o skeleton apropriado
• Cria referências remotas e locais envolvidas no RMI
• Implementa interface remota • Torna o RMI transparente• Serializa requests e desserializa replys
Binder
Objetos precisam descobrir referências remotas
O binder mapeia nomes para referências remotas bind(), rebind(), unbind()
O binder precisa rodar em um nome bem conhecido
CORBA Naming Service e RMIregistry
Binder
C
DrBd
bind
lookup
Proxy
Nome Ref
Object2 refToObj2
Nome Ref
DrawingBd refToDrBd
Object2 redToObj2
Um exemplo funcional, clientepublic class Client {
public void main(String args[]){DrawingBoard db = null;try{
// o servidor se registrou com WELLKNOWN_NAMEdb = (DrawingBoard)
Naming.lookup(WELLKNOWN_NAME);
}catch(Exception e){// Esta exceção pode ser Remote, Malformed ou
// NotBoundExceptionSystem.err.println(“Could not lookup server.
Reason: ” + e.getMessage());System.exit(1);
}
…//continua
Exemplo funcional, cliente…
// ainda dentro do main()try{
List allShapes = db.getAllShapes();Iterator it = allShapes.iterator();while(it.hasNext()){
Shape s = (Shape) it.next();display(s.getState());
}}catch(RemoteException e){
System.err.println(“comm. error:” + e.getMessage());
}} // main
} // class
public class DrawingBoardServer {public static void main(String args[]){
System.setSecurityManager(new RMISecurityManager());
try{
DrawingBoard db = new DrawingBoard(); Naming.rebind(“Drawing Board XPTO", db);
System.out.println(“DB server ready");
}catch(Exception e) { ... } }}
public class DrawingBoardImpl extends UnicastRemoteObject implements DrawingBoard{
private List<Shape> theList;
public Shape newShape(GraphicalObject g) throws RemoteException{
version++; Shape s = new ShapeImpl(g); theList.addElement(s); return s; }
public Vector getAllShapes()throws RemoteException{ return theList; }
}
public class GraphicalObject implements Serializable{
…}
Mais questões práticas
E se queremos adicionar novas classes que implementam Shape no sistema?
Como os objetos não-remotos são passados?
E se queremos adicionar novas classes que extendem GraphicalObject? De onde os clientes obterão o código? E se o código não for em apenas uma
linguagem?
Outras questões
Garbage collection distribuído Coordenação entre cliente e servidor, detecção
de falhas Uma alternativa são leases
Threads no servidor Multithreading precisa ser tratado pelo
programador
Activation service Redução do custo de manter serviços rodando
Limitações de Objetos Distribuídos
Invocações de métodos são síncronas Escalabilidade Conexão intermitente
Componentes são fortemente acoplados Extensibilidade
Alternativas: RMI assíncrono (conexão intermitente) Sistemas baseados em eventos
(escalabilidade, extensibilidade) Arquiteturas orientadas a serviços (todos os
pontos)
RMI assíncrono
A partir de CORBA 2.3 Implementado no lado cliente
Callback Cliente informa objeto que receberá
resposta Polling
Cliente recebe um handle para requisitar resposta mais tarde
RMI vs. Mensagens
RMI é uma boa idéia para um cliente-servidor simples?
E em um sistema de transferência de arquivos?
E em um sistema onde posso ter milhões de clientes?
E quando quero desempenho? E quando quero desenvolver rápido?
Sumário
Objetos distribuídos oferecem abstrações poderosas para o programador
Transparência total é impossível Falhas
O programador pode ou deve lidar com outros serviços Ex.: descoberta e ativação
Limitações do paradigma e alternativas
Para mais
Sobre objetos distribuídos Distributed Systems Concepts and Design,
Coulouris, Dollimore e Kindberg Estudos de caso com Java RMI e Corba Mais sobre Sistemas baseados em eventos
Objetos Distribuídos x Serviços Web Services are not Distributed Objects, Vogel,
IEEE Computing ou no blog dele
.Net Remoting .Net Remoting, Strawmyer
(http://www.developer.com/net/cplus/article.php/1479761)
Exemplo .Net Remoting: 1
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
namespace CodeGuru.Remoting { public class SampleObject : MarshalByRefObject{
public SampleObject() { } public string HelloWorld() {
return "Hello World!"; }
} }
Exemplo .Net Remoting: 2
public class SampleServer { public static int Main(string [] args) {
TcpChannel channel = new TcpChannel(8080); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType( typeof(SampleObject), "HelloWorld",
WellKnownObjectMode.SingleCall ); System.Console.WriteLine("Press the enter key to exit...");
System.Console.ReadLine(); return 0;
} }
Top Related