Sistemas Distribuídos Comunicação Remota Gustavo Reis [email protected] 1 - Comunicação Remota Comunicação entre processos está no coração de todo sistema distribuído. Não tem sentido estudar sistemas distribuídos sem examinar cuidadosamente os modos pelos quais processos em máquinas diferentes podem trocar informações. A comunicação em sistemas distribuídos é sempre baseada em troca de mensagens de baixo nível como a oferecida pela rede subjacente. Sistemas distribuídos modernos frequentemente consistem em milhares ou até milhões de processos espalhados por uma rede cuja comunicação não é confiável, como a Internet. Existem três modelos de comunicação de ampla utilização: Chamada de procedimento remoto (Remote Procedure Call - RPC) Middleware orientado a mensagem (Message-Oriented Middleware - MOM) Fluxo de dados. 2 - Comunicação Remota Chamada de procedimento remoto Muitos sistemas são baseados em troca explícita de mensagens entre processos. Contudo, os procedimentos send e receive não escondem absolutamente nada da comunicação, o que é importante para obter transparência de acesso em sistemas distribuídos. Proposta diferente de manipular comunicação por Birrell e Nelson (1984). 3 - Comunicação Remota Chamada de procedimento remoto A sugestão é permitir que programas chamassem procedimentos localizados em outras máquinas. Quando um processo na máquina A chama um procedimento na máquina B, o processo chamador A é suspenso, e a execução do procedimento chamado ocorre em B. Informações podem ser transportadas do chamador para quem foi chamado nos parâmetros e podem voltar no resultado do procedimento (a semântica de uma chamada remota deve ser idêntica à de uma chamada local: passa parâmetros e retorna resultados). 4 - Comunicação Remota Chamada de procedimento remoto A sugestão é permitir que programas chamassem procedimentos localizados em outras máquinas. Quando um processo na máquina A chama um procedimento na máquina B, o processo chamador A é suspenso, e a execução do procedimento chamado ocorre em B. Informações podem ser transportadas do chamador para quem foi chamado nos parâmetros e podem voltar no resultado do procedimento (a semântica de uma chamada remota deve ser idêntica à de uma chamada local: passa parâmetros e retorna resultados). 5 - Comunicação Remota Chamada de procedimento remoto 6 - Comunicação Remota Chamada de procedimento remoto O cliente que acessa um serviço inclui um procedimento stub para cada procedimento da interface de serviço. A função de um procedimento stub é semelhante à de um método proxy. Ele se comporta como um procedimento local para o cliente, mas em vez de executar a chamada, ela empacota o identificador de procedimento e os argumentos em uma mensagem de requisição e a envia para o servidor por meio de seu módulo de comunicação. 7 - Comunicação Remota Chamada de procedimento remoto Quando a mensagem de resposta chega, ela desempacota os resultados. O processo servidor contém um despachante junto com um procedimento stub de servidor e um procedimento de serviço, para cada procedimento na interface de serviço. O despachante seleciona um dos procedimentos stub de servidor, de acordo com o identificador de procedimento presente na mensagem de requisição. 8 - Comunicação Remota Chamada de procedimento remoto Um procedimento stub de servidor é como um método esqueleto, pois ele desempacota os argumentos presentes na mensagem de requisição, chama o procedimento de serviço correspondente e empacota os valores de retorno para a mensagem de resposta. Os procedimentos de serviço implementam os procedimentos da interface de serviço. 9 - Comunicação Remota RMI Java A RMI Java estende o modelo de objeto Java para dar suporte para objetos distribuídos na linguagem Java. Em particular, ela permite que os objetos invoquem métodos em objetos remotos usando a mesma sintaxe das invocações locais. Além disso, a verificação de tipo se aplica igualmente às invocações remotas e às locais. Entretanto, um objeto que faz uma invocação remota sabe que seu destino é remoto, pois precisa tratar exceções RemoteException; e o implementador de um objeto remoto sabe que é remoto porque precisa implementar a interface Remote. 10 - Comunicação Remota RMI Java Interface remota 11 - Comunicação Remota RMI Java Implementação da Interface 12 - Comunicação Remota RMI Java Passagem de parâmetros e resultados Na RMI Java, supõe-se que os parâmetros de um método são parâmetros de entrada e o resultado de um método é um único parâmetro de saída. Qualquer objeto que seja serializável – isto é, que implemente a interface Serializable – pode ser passado como argumento ou ser resultado na RMI Java. Todos os tipos primitivos e objetos remotos são serializáveis. As classes de argumentos e valores de resultado são carregadas por download no destino pelo sistem RMI, quando necessário. 13 - Comunicação Remota RMI Java Classe serializada 14 - Comunicação Remota RMI Java Download de classes A linguagem Java é projetada para permitir que as classes sejam carregadas por download de uma máquina virtual a outra. Isso é particularmente relevante para objetos distribuídos que se comunicam por meio de invocação remota. Se o destino ainda não possuir a classe de um objeto passado por valor, seu código será carregado por download automaticamente. 15 - Comunicação Remota RMI Java RMIregistry O RMIregistry é o vinculador da RMI Java. Uma instância de RMIregistry deve ser executada em cada computador servidor que contenha objetos remotos. Ele mantém uma tabela mapeando nomes textuais no estilo dos URLs, em referências para objetos remotos contidos nesse computador. Ele é acessado por métodos da classe Naming, cujos métodos recebem como argumento uma string no formato como URL, na forma: • //nomeComputador:porta/nomeObjeto 16 - Comunicação Remota RMI Java Classe Naming 17 - Comunicação Remota RMI Java Classe serializada 18