300 likes | 476 Views
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?
E N D
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, ...
local C remote E local invocation invocation remote invocation invocation F B local A invocation D O Modelo • Um Objeto Remoto é aquele que pode receber uma invocação remota (RMI) • Referências remotas • Interfaces remotas
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) C Interface remota m1 m2 m1 A m2 m3 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
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 createShape, getAllShapes DrBd Cliente shape shape getState, setState
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 RMI import java.rmi.*; public interface DrawingBoard extends Remote { Shape createShape(GraphicalObject g) throws RemoteException; List getAllShapes() throws RemoteException; } public interface Shape extends Remote { GraphicalObjectgetState() 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 { GraphicalObjectgetState(); void setState(in GraphicalObject g) } struct GraphicalObject { ... }
getAllShapes Ref remota para shape GraphicalObject setState referência remota cópia serializada 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 DrBd Cliente 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
B Reply Request • Implementa o protocolo de reply response • Skeleton: • Implementa métodos da interface remota • Desserializa requests e serializa replys • Implementa interface remota • Torna o RMI transparente • Serializa requests e desserializa replys Proxy p/ B • Dispatcher: • Recebe msgs do módulo de comunicação e invoca o skeleton apropriado • Cria referências remotas e locais envolvidas no RMI Arquitetura de um Sistema de Objetos Distribuídos cliente servidor Skeleton e Dispatcher da classe de B C S Módulo de Ref. remota Módulo de comunicação Módulo de comunicação Módulo de Ref. remota
lookup bind Proxy Binder 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 C DrBd
Um exemplo funcional, cliente public class Client { public void main(String args[]){ DrawingBoard db = null; try{ // o servidor se registrou com WELLKNOWN_NAME db = (DrawingBoard) Naming.lookup(WELLKNOWN_NAME); }catch(Exception e){ // Esta exceção pode ser Remote, Malformed ou // NotBoundException System.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; } }
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; } }