Pesquisar este blog

quarta-feira, 3 de setembro de 2014

Sistemas distribuídos baseado em objetos

Sistemas distribuídos baseado em objetos

Em um sistema distribuído temos muitos processos diferentes, rodando em diversas máquinas diferentes e trocando dados entre si. Uma das maneiras de se estabelecer uma comunicação entre dois processos é possível ser realizada se estabelecermos um protocolo de troca de dados entre eles, como o TCP.
Caso um processo A deseja receber o cálculo do determinante de um número inteiro n, ele pode realizar esta operação da seguinte forma:
det = determinante_matriz(n)
Porem, caso o processo A não saiba realizar o cálculo do determinante de uma matriz e o processo B sabe, esta chamada então, pode ser realizada da seguinte maneira.

stream = abreConexao(porta_processoB);
write(stream, "determinante_matriz"); // envia um comando
write_matrix(stream, n); // envia argumentos
read(stream, &det); // pega o resultado
fecha_conexao(stream);
Agora suponha que A e B sejam sistemas baseados em objetos, não importa qual linguagem seja utilizada, um objeto é a mesma coisa em qualquer linguagem, basicamente uma lista de argumentos e métodos. A transmissão de um objeto entre estes dois sistemas pode ser transparente, caso os dois sistemas concordem na definição de um objeto. A conexão e transmissão pode ser realizada automaticamente.

O que é um sistema distribuído baseado em Objetos?

Um sistema distribuído baseado em objetos é exatamente isto. Assim que um objeto é definido em uma linguagem descritiva genérica, um gerador de interfaces é executado e produz definições específicas de linguagens e rotinas de como transmitir os objetos entre programas. Com isso, cada programa se torna um sistema de cliente/servidor para alguns objetos específicos.
Portanto nenhuma das partes precisa conhecer os detalhes da outra. Cada um dos softwares registram os tipos de objetos disponíveis, para comunicação como um tipo ORB (Object Request Broker). Quando um programa A necessita de um serviço, ele irá se conectar ao ORB, que fará o roteamente o colocará o programa A em contato com o softaware provedor do objeto requisitado. A sequencia de chamadas agora ficará da seguinte forma.

Programa A                           Programa B
inclui geraMatriz.h                inclui geraMatriz.h
                                               contacta_ORB(objetoORB);
                                               prove_servico_ORB(objetoORB, ClasseMatriz);
 contacta_ORB(objetoORB);
requisita_servico_ORB(objetoORB, ClasseMatriz);
ClasseMatriz minhaMatriz = new (...);
det = minhaMatriz.determinante();
Com isso a chamada ao método determinante da classe MinhaMatriz é transparente, o programa B manda uma matriz e a chamada ao método espera por uma resposta. O código tanto de A, quanto de B é bem mais simples.

Como isso funciona?

A classe MinhaMatriz é definida em uma linguagem de descriçao genérica, onde são especificadas os seus conteúdos e os métodos públicos. Esta linguagem geralmente é chamada de IDL (Interface Description Language). Em um primeiro passo da compilação, o arquivo MinhaMatriz.idl é traduzida em todas as linguagens definidas pelo sistema, como Java, C++, Lisp, etc...). Após isso, cada programa irá pegar os arquivos gerados para a sua linguagem e incluí-los em seu classpath.
O código gerado contem não apenas os seus atributos, como também os métodos que são utilizados para quebrar a classe em componentes (processo conhecido como marshalling), que serão enviados através de uma conexão ao outro programa, e ao ser recebido (o processo de unmarshalling) será responsável por reconstruir o objeto na outra ponta.

Problemas:

Tudo isso é bem simples quando estamos trabalhando com uma mesma linguagem, porém passar objetos entre linguagens diferentes, como Java, List, etc, é bem complicado, pois geradores de ORB diferentes serão utilizados.

Padrões

CORBA(Common Object Request Broker) gerado pela OMG define um padrão de implementação para o ORB. A última especificação do CORBA, que consta no site da OMG é a 3.1.1 de 2012.
O CORBA é uma especificação que vem crescendo ao longo dos anos, devido a sua facilidade de utilização, funcionalidade e portabilidade entre linguagens. CORBA é bem utilizada nas grandes empresas, onde muitos sistemas interagem, interagem entre si, e sistemas antigos não podem ser desligados (vide nossos bancos). O CORBA prove uma forte ligação entre linguagens e/ou plataformas diferentes, e a sua única limitação é ter uma implementação CORBA para cada uma das linguagens/plataformas necessárias.
Existem várias implementações da especificação do CORBA, como o Visibroker da Borland. Empresas como a Oracle a IBM também possuem suas implementações desta especificação.
Java tem uma implementação de RPC/ORB chamada RMI (remote method invocation), que possui algumas semelhanças com o CORBA e suas principais diferenças são. No RMI podemos enviar objetos como parâmetros, enquanto que no CORBA devemos enviar apenas tipos primitivos ou estrutura de dados. Além disto, no RMI é possível enviarmos implementações de código entre as máquinas, permitindo que tenhamos um servidor como provedor de código remoto.

Java RMI

Tutoriais de java RMI
DevMedia Portugues
Oracle Inglês




Nenhum comentário:

Postar um comentário