Baixe o app para aproveitar ainda mais
Prévia do material em texto
ARQUITETURA DA INFORMAÇÃO 1 ....................................................... 2 Aula 3: Processamento Distribuído com RPC e RMI ............................................................................................................................. 2 Introdução ................................................................................................................................ 3 Conteúdo Processamento paralelo ................................................................................................... 3 Processamento distribuído .............................................................................................. 5 ........................................................................................... 7 RPC (Remote Procedure Call) .................................................................................... 11 RM(Remote Method Invocation) .......................................................................................... 14 Marshalling e Unmarshalling Serviços de nomes e diretórios ..................................................................................... 15 Atividade proposta .......................................................................................................... 16 ........................................................................................................................... 16 Referências ......................................................................................................... 17 Exercícios de fixação Chaves de resposta ..................................................................................................................... 21 ARQUITETURA DA INFORMAÇÃO 2 Introdução Uma evolução natural da programação foi a utilização de processamento paralelo para a resolução de problemas complexos. A distribuição de processamento também é utilizada com tal finalidade, ou em situações nas quais os participantes de uma transação não se encontram fisicamente no mesmo local. Esta aula visa elucidar conceitos como processamento paralelo e distribuído, além de descrever tecnologias de grande aceitação na implementação de sistemas distribuídos, como RPC e RMI. Objetivo: 1. Compreender o processamento distribuído e uso do RPC; 2. Conhecer a tecnologia Java RMI. ARQUITETURA DA INFORMAÇÃO 3 Conteúdo Processamento paralelo 1945 Já em 1945, nos trabalhos de Von Neumann, as arquiteturas de processamento paralelo eram apresentadas como uma solução para aumento do poder de processamento. As técnicas de processamento paralelo sempre visaram ao melhor aproveitamento do tempo de CPU, particularmente quando ocorriam “demorados” procedimentos de Entrada e Saída. 1950 a 1970 De 1950 a 1970 era comum a utilização de computadores monoprocessados. Havia uma busca por processadores cada vez mais velozes, porém existiam barreiras físicas para essa velocidade, assim, a solução mais viável para a otimização do tempo consistiria posteriormente em trabalhar com máquinas multiprocessadas. A miniaturização proporcionada pela evolução da tecnologia de transistores permitiu que até mesmo bilhões deles fossem integrados em um chip, viabilizando a definição de arquiteturas de processadores com mais unidades funcionais e memória cache. Com isso, temos hoje processadores com vários núcleos, com grande poder de processamento, mais bem explorados pelas técnicas de programação paralela com multitarefa. Em linguagem Java, uma tarefa independente pode ser definida pela extensão da classe Thread. Outra forma seria a implementação da interface Runnable, o que não elimina a necessidade da chamada inicial com uma classe Thread. A tarefa que deverá ser executada continuamente em paralelo é definida no ARQUITETURA DA INFORMAÇÃO 4 método run, e quando há necessidade de sincronização utiliza-se a palavra- chave synchronized. (imagem representativa do método run) ARQUITETURA DA INFORMAÇÃO 5 Processamento distribuído A distribuição de processamento também pode ocorrer ao longo de uma rede, com diferentes processos sendo executados em máquinas remotas, segundo protocolos específicos de comunicação. O termo DCE (Distributed Computing Environment) é comumente utilizado para definir esse tipo de ambiente, onde vários componentes de software, como serviços de diretórios, gestores de segurança, sistemas de objetos distribuídos, entre vários outros, trabalham em conjunto para a construção de complexos sistemas corporativos. Dentro de uma rede TCP-IP, a definição de um serviço distribuído de forma mais simples envolve a construção de um servidor, normalmente trabalhando com paralelismo, que seja capaz de escutar uma porta específica destinada ao serviço oferecido, e clientes capazes de se comunicar com esse servidor segundo um protocolo previamente estabelecido. Um código em linguagem Java de exemplo para a criação de um sistema cliente-servidor com uso de Socket. Embora qualquer sistema cliente-servidor possa atuar dessa forma, algumas arquiteturas próprias foram definidas para a formalização dos serviços distribuídos, como o RPC e o RMI. ARQUITETURA DA INFORMAÇÃO 6 ARQUITETURA DA INFORMAÇÃO 7 (imagem representativa de um código em linguagem Java) RPC (Remote Procedure Call) A chamada remota de procedimento (RPC) trata de um modelo de comunicação entre processos que viabiliza a chamada de um procedimento em outro espaço de endereçamento, normalmente em outro computador da rede, sem que o programador tenha que se preocupar com detalhes dessa interação remota, assemelhando-se a chamadas locais em termos de código. Com isso, o uso de RPC simplifica a criação de sistemas distribuídos deixando a comunicação transparente para o programador. Essa é uma ideia antiga, datando de 1976, quando foi descrita na RFC 707. Foi utilizada de maneira comercial inicialmente pela Xerox, em 1981, sendo a primeira implementação popular efetuada para UNIX com o Sun RPC, usado como base para o NFS (Network File System). Várias extensões da comunicação remota para ambientes de objetos distribuídos, como CORBA e DCOM, são baseadas em diferentes implementações do RPC. As ferramentas para criação de aplicativos RPC cuidam da geração dos stubs para garantir essa transparência. ARQUITETURA DA INFORMAÇÃO 8 A ideia fundamental é a de que o servidor exporta apenas a interface de procedimentos e funções, da mesma forma que ocorreria com uma API ou biblioteca. O programa cliente faz a chamada ao procedimento remoto, com a passagem dos parâmetros necessários, e recebe a resposta, como se estivesse chamando um simples método local. O par de stubs faz a transformação de chamadas e respostas nas mensagens necessárias para a comunicação em rede. Em termos do servidor, esse elemento responsável pela interceptação das chamadas é comumente denominado skeleton, e deve receber a chamada, ativar o componente de software responsável pelo processamento do pedido, e retornar com a resposta solicitada. Com todas essas características, o único vínculo real entre o código do cliente e o do servidor é a interface de exposição de serviços, a qual segue uma sintaxe bastante simples. Um exemplo de sistema com uso de RPC na sintaxe C, bem como a interface de exposição dos serviços: /* addsub.x : definição da interface */ #define PROGRAM_NUMBER 12345678 #define VERSION_NUMBER 1 /*tipo de dado que será passado aos procedimentos remotos */ struct operands { int x; int y; ARQUITETURA DA INFORMAÇÃO 9 }; /* Definição da interface que será oferecida aos clientes */ program ADDSUB_PROG { version ADDSUB_VERSION { int ADD (operands) = 1; int SUB (operands) = 2; } = VERSION_NUMBER; } = PROGRAM_NUMBER; Com o uso do utilitário rpcgen são gerados vários arquivos a partir desse arquivo de interface, compreendendo toda a parte de comunicação e oferta de serviços, o que deixará para o programador a simples tarefa de implementar as regras de negócios do aplicativo, sem se desgastar com a comunicação e distribuição. /* Arquivo server.c: um servidor RPC simples */ #include <stdio.h> #include "addsub.h" /* implementação da função add */ int * add_1_svc (operands *argp, struct svc_req *rqstp) { static int result; printf ("Recebi chamado: add %d %d\n", argp->x, argp->y); result = argp->x + argp->y; return (&result); } /* implementação da função sub */ ARQUITETURA DA INFORMAÇÃO 10 int * sub_1_svc (operands *argp, struct svc_req *rqstp) { static int result; printf ("Recebi chamado: sub %d %d\n", argp->x, argp->y); result = argp->x - argp->y; return (&result); } O código do cliente é um pouco mais complexo que o do servidor, mas é fácil observar como a chamada remota assemelha-se a uma simples chamada de função local. /* Arquivo client.c: um cliente RPC simples */ #include <stdio.h> #include "addsub.h" /* função que chama a RPC add_1 */ int add (CLIENT *clnt, int x, int y) { operands ops; int *result; /* junta os parâmetros em um struct */ ops.x = x; ops.y = y; /* chama a função remota */ result = add_1 (&ops,clnt); if (result == NULL) { printf ("Problemas ao chamar a função remota\n"); exit (1); } return (*result); } int main( int argc, char *argv[]) { CLIENT *clnt; int x,y; ARQUITETURA DA INFORMAÇÃO 11 /* verifica se o cliente foi chamado corretamente */ if (argc!=4) { fprintf (stderr,"Usage: %s hostname num1 num2\n",argv[0]); exit (1); } /* cria uma struct CLIENT que referencia uma interface RPC */ clnt = clnt_create (argv[1], ADDSUB_PROG, ADDSUB_VERSION, "udp"); /* verifica se a referência foi criada */ if (clnt == (CLIENT *) NULL) { clnt_pcreateerror (argv[1]); exit(1); } /* obtém os dois inteiros que serão passados via RPC */ x = atoi (argv[2]); y = atoi (argv[3]); /* executa um procedimento remoto */ printf ("%d + %d = %d\n", x, y, add (clnt,x,y)); return (0); } (imagens representativas de Interface para definição dos serviços (IDL).) RM(Remote Method Invocation) A tecnologia RMI pode ser considerada como a versão orientada a objetos do RPC, disponível para a linguagem Java. Nesse modelo o que temos é um objeto hospedado e executado em determinado servidor, registrado via RMI Registry, e que disponibiliza métodos para acesso remoto. A arquitetura de comunicação do RMI pode ser observada no desenho seguinte, onde pode ser vista a presença dos stubs nos clientes e do skeleton no servidor. ARQUITETURA DA INFORMAÇÃO 12 (imagem representativa da tecnologia RMI) O passo inicial para o desenvolvimento de um sistema com uso de RMI é a definição da interface remota, o que equivaleria à definição da IDL utilizada no RPC, porém restrita ao universo Java. Essa interface deverá ser descendente da interface Remote e cada método dela deverá considerar a ocorrência da exceção RemoteException, como pode ser observado no exemplo seguinte: ARQUITETURA DA INFORMAÇÃO 13 Criada a interface, deve ser definido um objeto servidor que a implementa, criando assim os métodos do serviço. Esse objeto também deve ser descendente de UnicastRemoteObject. Um objeto da classe CalcRemote deve ser instanciado e registrado pelo programa servidor, ficando disponível para os clientes através da escuta efetuada pelo RMI Registry. ARQUITETURA DA INFORMAÇÃO 14 Com relação ao cliente, este deverá localizar o objeto servidor através do protocolo gerenciado pelo RMI Registry, efetuando a chamada aos métodos remotos, segundo o que foi definido em ICalcRemote. O uso de RMI permite a definição de um DCE de grande simplicidade de uso para a linguagem Java, permitindo a passagem de informações através de objetos serializáveis mais complexos, segundo um padrão Proxy, diminuindo muito o esforço de programação. No entanto, quando são tratados os sistemas corporativos, vários requisitos, como transações, pooling e autenticação, podem não ser oferecidos de forma simples pelo RMI. Para satisfazer a esse tipo de necessidade são utilizados ambientes de objetos distribuídos. Marshalling e Unmarshalling Um conceito comum em termos de programação orientada a objetos é a serialização de objetos. A serialização é a transformação de dados em geral, que estejam em memória, para um formato adequado em array de bytes, pronto para armazenagem ou transferência do mesmo. ARQUITETURA DA INFORMAÇÃO 15 Em outro momento o processo inverso (desserialização) pode ser efetuado, partindo do array de bytes e montando a estrutura novamente em memória, claro que ocupando locais diferentes da mesma. Em termos de comunicação remota, um conceito similar é o de Marshalling e Unmarshalling, pois trata da transformação dos dados estruturados segundo uma determinada tecnologia, como Java ou C#, em formato compatível com as mensagens que são trafegadas entre os stubs (Marshalling), bem como o processo inverso, para a recuperação dos dados a partir da mensagem (Unmarshalling), lembrando que nas duas pontas as linguagens podem ser distintas. Serviços de nomes e diretórios A chamada remota de procedimento (RPC) trata de um modelo de comunicação entre processos que viabiliza a chamada de um procedimento em outro espaço de endereçamento, normalmente em outro computador da rede, sem que o programador tenha que se preocupar com detalhes dessa interação remota, assemelhando-se a chamadas locais em termos de código. Associam nomes a recursos computacionais em rede; Funcionam como “diretórios” compartilhados; Envolvem funções de localização e registro de elementos; Permitem armazenar objetos, certificados digitais e outros elementos serializáveis. Amplamente utilizados pelas instituições bancárias, DAP (Directory Access Protocol) e LDAP (Lightweight Directory Access Protocol) são exemplos desse tipo de serviço. No caso da tecnologia Java, as ações de registro e localização são feitas pelo JNDI (Java Naming and Directory Interface), o qual apresenta ARQUITETURA DA INFORMAÇÃO 16 uma interface única entre os diversos serviços de diretório, gerenciando inclusive o acesso a recursos como RMI, CORBA, DAP, LDAP e JEE. Atividade proposta Implemente um serviço RMI que receba o valor de dois catetos de um triângulo retângulo e retorne o valor da hipotenusa. Parâmetros de entrada: double cateto1, double cateto2 Retorno: double Cálculo: hipotenusa = Math.sqrt(Math.pow(cateto1,2)+Math.pow(cateto2,2))Referências Silva, F. Sistemas Distribuídos: Conceitos e Projeto RPC e RMI, UFMA, 2013 http://www.deinf.ufma.br/~fssilva/graduacao/sd/aulas/rpc_rmi.pdf Grosso, W. Java RMI (Java Series), O’Reilly, 2001. ARQUITETURA DA INFORMAÇÃO 17 Exercícios de fixação Questão 1 Quando trabalhamos com processamento paralelo, um problema comum é a utilização de recursos compartilhados que podem ser lidos ou escritos de forma errônea devido à preempção. Para resolver isso deve ocorrer um sequenciamento no acesso ao recurso, o que é obtido no Java com o uso da palavra reservada: a) static b) volatile c) synchronized d) abstract e) final Questão 2 Uma classe ServerSocket deve escutar uma porta especificada e aceitar conexões solicitadas pelos clientes, repassando as mesmas para objetos Socket locais, o que define o circuito virtual entre cliente e servidor. Qual o método utilizado para aceitar uma conexão? a) start b) accept c) getInputStream d) getOutputStream e) close Questão 3 A utilização de RPC viabiliza a construção de sistemas de processamento distribuído com um formato de comunicação transparente para o programador. Quem permite esta transparência são os _______________ definidos para o padrão Proxy. a) senders b) idles c) clients ARQUITETURA DA INFORMAÇÃO 18 d) stubs e) publishers Questão 4 Na arquitetura do RPC, o elemento responsável por tratar as chamadas no servidor é denominado: a) IDL b) stub c) skeleton d) Socket e) ServerSocket Questão 5 O elemento na arquitetura do RPC que permite a geração automática de todo o aparato de comunicação em rede, de forma automatizada, por ferramentas como o rpcgen é: a) IDL b) stub c) skeleton d) Socket e) ServerSocket Questão 6 Em sistemas de processamento distribuído ocorre a necessidade de registrar e localizar componentes disponibilizados remotamente. O componente de software responsável por executar esta função seria: a) Interface de Descrição de Serviços b) Serviço de Nomes e Diretórios c) Temporizador d) Protocolo de Comunicação e) Gerenciador do Banco de Dados ARQUITETURA DA INFORMAÇÃO 19 Questão 7 A transformação dos dados estruturados segundo uma determinada tecnologia, como Java ou C#, em formato compatível com as mensagens que são trafegadas entre os stubs é denominada: a) serialização b) unmarshalling c) marshalling d) de-serialização e) vetorização Questão 8 Em termos de RMI a descrição dos serviços é feita na própria linguagem Java através de uma interface descendente de: a) Remote b) Runnable c) MessageListener d) Serializable e) CommandListener Questão 9 Considere as afirmativas abaixo: I – Os métodos expostos pela interface remota do RMI devem considerar a ocorrência da exceção RemoteException. II – Criada a interface, deve ser definido uma classe que implementa a mesma e seja descendente de UnicastRemoteObject. III – Os passos I e II são necessários e suficientes para a criação de um servidor RMI. Quais as afirmativas corretas? a) Todas estão corretas b) Apenas a I está correta c) Apenas a II está correta d) As alternativas I e II estão corretas ARQUITETURA DA INFORMAÇÃO 20 e) Nenhuma está correta Questão 10 No ambiente Java os serviços de nomes e diretórios são acessados através de: a) DAP b) LDAP c) DNS d) JEE e) JNDI ARQUITETURA DA INFORMAÇÃO 21 Aula 3 Exercícios de fixação Questão 1 - C Justificativa: Em linguagem Java uma tarefa independente pode ser definida pela extensão da classe Thread ou pela implementação da interface Runnable, e quando há necessidade de sincronização utiliza-se a palavra-chave synchronized. Questão 2 - B Justificativa: Os métodos getInputStream, getOutputStream e close pertencem à classe Socket, enquanto start inicia uma Thread. O método accept pertence ao ServerSocket e serve para receber uma conexão na porta especificada na inicialização do mesmo. Questão 3 - D Justificativa: As ferramentas para criação de aplicativos RPC cuidam da geração dos stubs para garantir a transparência da comunicação em rede. O par de stubs faz a transformação de chamadas e respostas nas mensagens necessárias. Questão 4 - C Justificativa: Em termos do servidor, o elemento responsável pela interceptação das chamadas é comumente denominado skeleton, e deve receber a chamada, ativar o componente de software responsável pelo processamento do pedido, e retornar com a resposta solicitada. Questão 5 - A Justificativa: A utilização de Socket e ServerSocket de forma plana não constituiria um sistema RPC. Nas arquiteturas do tipo RPC deve haver uma IDL ARQUITETURA DA INFORMAÇÃO 22 (Interface Definition Language) que permita a aplicativos como o rpcgen gerar os stubs para a comunicação com o skeleton do servidor. Questão 6 - B Justificativa: Tanto no uso de RMI quanto no uso de CORBA, JEE, ou qualquer outro recurso que precise ser acessado a partir de uma localização externa ao programa que fornece este recurso, é comum o uso de serviços de nomes e diretórios. Questão 7 - C Justificativa: A transformação dos dados para o formato de envio é denominada marshalling, enquanto o processo inverso, na recepção, é denominado unmarshalling. Questão 8 - A Justificativa: O passo inicial para o desenvolvimento de um sistema com uso de RMI é a definição da interface remota, o que equivaleria à definição da IDL utilizada no RPC, porém restrita ao universo Java. Esta interface deverá ser descendente da interface Remote. Questão 9 - D Justificativa: A alternativa III está incorreta, pois seria ainda necessário criar um aplicativo (main) que registre uma instância da classe criada em II, bem como o rmiregistry deverá estar em execução para que este aplicativo consiga também executar. Questão 10 - E Justificativa: No caso do Java, as ações de registro e localização são feitas pelo JNDI, o qual apresenta uma interface única entre os diversos serviços de diretório, gerenciando inclusive o acesso a recursos como RMI, CORBA, DAP, LDAP e JEE.
Compartilhar