Pesquisar este blog

sexta-feira, 7 de março de 2014

Sistemas Distribuídos Comunicação (Protocolo de rede, RPC e DCE)

Comunicação em Sistemas Distribuídos

A comunicação exerce um papel crucial em um sistema distribuído. Estudar sistemas distribuídos sem estudar comunicação não faz nenhum sentido.

Como sabemos, em um sistema distribuído, várias máquinas dividem a tarefa de executar um processo e, por isso saber como elas conversam entre si é um fator tão importante. Este post inicia os estudos de como é feita a comunicação entre cada um dos componentes de um sistema distribuído. Esta comunicação abrange desde os protocolos de rede utilizados na troca de informações entre as máquinas quanto as quatro maneiras de comunicação mais utilizadas nos sistemas de hoje, chamada de procedimento remota (RPC- Remote Procedure Call), middleware orientado a mensagens (MOM Message Oriented Middleware), streaming e finalmente comunicação do tipo multicasting será descrita.

Protocolos de rede

Quando duas máquinas querem conversar elas não compartilham a memória, ao invés disto elas enviam e recebem mensagens de comunicação.

O primeiro passo para se estabelecer uma comunicação entre duas máquinas é a definição do protocolo que será utilizado na comunicação entre elas. Os protocolos são análogos as línguas que usamos para falar,  portanto duas máquinas conversando com protocolos diferentes é a mesma coisa que colocarmos um Árabe para falar com um Chinês, como eles não falam a mesma língua a conversa não vai fluir.

No caso das pessoas basta que elas saibam uma língua em comum para que elas consigam se comunicar de forma eficiente, já no caso das máquinas elas precisam definir qual protocolo será utilizado.

Um protocolo define desde a parte física da comunicação, definindo atributos, como a quantidade de volts que serão utilizadas para determinar o valor do 1 e o valor do 0, no caso de uma comunicação binária, quanto saber qual é a última informação de uma mensagem, se ela perdeu alguma informação entre a transmissão e a recepção. Este tipo de controle é muito importante para manter o fluxo de comunicação de maneira correta e válido. Outros tipos de informações muito importantes a serem definidos nos protocolos são, as informações de qual será o tamanho das variáveis numéricas, textuais e outros tipos de dados. Todas estas informações são necessárias para estabelecer a comunicação entre duas máquinas.

O padrão mais conhecido de comunicação entre duas máquinas é o modelo OSI, que foi criado em 1995. Este modelo divide a comunicação entre máquinas em 7 camadas, que serão mostradas a seguir:

  1. Física: onde são definidos quais dispositivos serão usados como modem, Bluetooth, USB, DSL, Rede Ethernet, etc
  2. Enlace ou dados: camada utilizada para corrigir os possíveis erros de comunicação existentes entre as partes, controla o fluxo e estabelece comunicação entre sistemas diretamente conectados, como Ethernet, 802.11 WiFi, etc.
  3. Rede: Fornece meios funcionais para conexões entre redes e realiza o roteamento das funções,podendo realizar uma fragmentação dos dados, como IP(IPV4, IPV6), IPSec.
  4. Transporte: Responsável pelo transporte dos dados recebidos pela camada de sessão para a camada de Rede. Dentre as funções desta camada temos o controle de fluxo, a ordenação dos pacotes e a correção de erros. Garante a entrega das mensagens na sequencia correta, sem perder ou duplicar pacotes. Esta camada separa as camadas de nível físico (1 a 3) das camadas do nível de aplicação (5 a 7), e ela é utilizada pelo TCP, UDP, RTP, SCTP, etc
  5. Sessão: Determina como será a transmissão dos dados para que duas máquinas diferentes se comuniquem. Marca os dados, no intuito de possibilitar a correção deles no futuro para caso haja falha na transmissão dos pacotes, a transmissão será reiniciada de onde parou, usado por exemplo, pelo NetBIOS, etc
  6. Apresentação: Responsável por realizar traduções, como uma Tabela ASCII para outro padrão, pela compactação dos dados e pode ser usada com alguma criptografia, como exemplos temos o  XDR, TLS, etc
  7. Aplicação: São os programas que usamos para se comunicar na rede, é a interface entre o usuário e a máquina, como exemplos temos o BitTorrent, Telnet, SSH, DNS, Ping, HTTP, FTP, SMTP, etc.

Antes de definir como os computadores se comunicam iremos abordar alguns pontos importantes para o entendimento de como os parâmetros são passados para os métodos em uma linguagem.

Stub

Stub em ciência da computação é usado para definir um esboço de um método e eles são muito úteis para portabilidade, sistemas distribuídos e teste de software.

Um método stub contém algumas partes de código que realizam uma abstração de uma camada de software. Eles se comportam como um proxy para objetos remotos. Tendo como exemplo um método de soma, localizado em um servidor, um stub deste método seria uma interface local, com apenas a mesma assinatura deste método e ao ser chamado ele chamaria o método remoto. Atuaria como um proxy.

Call-by-name e Call-by-value 

Quando usamos parâmetros em métodos dentro de um programa que estamos construindo, eles podem ser interpretados de maneiras diferentes, que são definidos por call-by-name, e call-by-value.

Um parâmetro Call by value  tem o seu valor copiado para o parêmetro do método, ou seja, quando o método alterar aquela variável nada acontecerá com o valor da variável original.

Já em um parâmetro do tipo Call by name isso não acontece, pois ela é passada como um ponteiro para o método, e o valor utilizado dentro daquele método referencia a mesma área da memória que a variável original, com isso qualquer modificação realizada no método também será realizada na variável original. 

Na linguagem C parâmetros do tipo int, byte são value e parâmetros do tipo array são name. O mesmo vale para Java e C#, assim como as outras linguagens que são executadas em seus ambientes.

Esta diferença entre as variáveis recebidas pelos métodos também acontece, nas chamadas remotas a métodos, conforme será mostrado a seguir.

RPC

RPC é um tipo de chamada remota a um método, e estas chamadas quase sempre se comportam de maneira análoga ao procedimento realizado localmente na máquina, quando estamos tratando de parâmetros dos métodos, mesmo para os parâmetros Call-by-name caso este valor seja alterado remotamente, a variável local será alterada também. Como exemplo de RPC podemos ter a leitura de um arquivo, a execução de um método, a autenticação, etc.

As RPCs são utilizadas quando queremos rodar um método, ou um procedimento em uma máquina remota.

No caso desta execução ser em um método de leitura de dados, por exemplo uma leitura de um arquivo do sistema de armazenamento, quando este tipo de operação é realizada em um sistema local, o computador chama um procedimento de leitura de dados do Sistema Operacional, ou seja, existe uma interface entre o método de leitura da linguagem utilizada e a chamada a leitura do Sistema Operacional. Para fazer uma chamada de leitura de dados de maneira remota, uma chamada análoga é realizada, só que desta vez faremos uma requisição de leitura para o stub da máquina remota. 

Por padrão as RPCs são síncronas, ou seja, ao chamar um método seu sistema fica travado, esperando que a resposta deste método chegue, para poder continuar a execução.

Chamadas síncronas são utilizadas quando a resposta daquele método é necessária para a continuidade da execução do método corrente, por exemplo, em um método de login, a validação da senha pode ser uma chamada síncrona, já que ela é necessária para validar se o usuário pode ou não prosseguir.

RPC Assíncrono

Em uma execução de um RPC comum o cliente ficará travado, esperando pelo resultado da chamada ao método para poder continuar a sua execução. Ao fazer uma chamada assíncrona isso não acontece. Esta implementação de RPC provê ferramentas para facilitar a utilização dela de maneira assíncrona. 

Um exemplo de chamada assíncrona é o carregamento de dados após um login, muitas vezes o sistema já carrega dados do usuário, que não são necessários para o login, como endereço, telefones, etc, assincronamente, com isso é possível logar em um site, e ir para a home, sem ter que esperar o resultado da busca destas informações no banco de dados.

DCE ou Distributed Computing Environment

O DCE é uma implementação de chamadas remotas a procedimentos, no nível do sistema operacional. Esta implementação provê uma maneira de realizarmos chamadas remotas as interfaces do sistema operacional, e isso é feito de maneira que elas pareçam ser realizadas realizadas localmente, pelo menos pro programador há esta impressão. Este tipo de implementaçã é uma abstração do sistema operacional para a rede.

Ele foi inicialmente desenvolvido para o Unix por um consórcio chamado de Apollo Computer, mas depois uma implementação para o Windows foi realizada.

A implementação do DCE provê um framework para o desenvolvimento de aplicativos cliente/servidor, que inclui RPC, um serviço de nomeação de diretórios, autenticação, um serviço de relógio e um sistema de arquivos distribuído.

As implementações de WebServices, Java e a própria internet carregam em si muitos dos conceitos elaborados pelo DCE. Uma das implementações atuais de DCE é o sistema de ODBC da Microsoft, utilizado para comunicação com banco de dados.

O DCE é dividido em células onde cada uma delas contem um Serviço de Segurança, um Diretório, que será o repositório de Controle de acesso ao sistema e um Sistema de relógio distribuído.


Nenhum comentário:

Postar um comentário