Pesquisar este blog

quarta-feira, 12 de março de 2014

Sistemas Distribuídos Comunicação (Socket, stream, mpi e message queue)

A descrição da comunicação em sistemas distribuídos, começou a ser mostrada no post anterior, aqui neste post a comunicação dos sistemas distribuídos continuará a ser descrita, incluindo a comunicação orientada por mensagens e broadcasting.


1. Comunicação orientada por mensagens

Remote procedure calls e remote object invocations são chamadas que promovem a transparência nas chamadas e com isso acabam escondendo um pouco da comunicação existente para a realização destas chamadas.

Ao fazer uma RPC não conseguimos detectar se o sistema, onde faremos a chamada está rodando, com isso o desenvolvimento de sistemas de comunicação alternativos foram necessários. Além disto, a natureza síncrona de uma chamada RPC algumas vezes precisa ser substituída por outra implementação.

Aqui serão apresentados os sistemas de mensagem que são uma alternativa ao RPC nos sistemas distribuídos.

2. Sockets

Conceitualmente um socket é um ponto de conexão onde uma aplicação pode escrever dados que serão transmitidos pela rede, ou ler dados que chegam pela rede. O socket é uma camada de abstração utilizada pelo sistema operacional e por um protocolo de transmissão de dados específico, para abrir um canal de comunicação entre duas máquinas.

Um servidor socket, quando se inicializa, reserva recursos da máquina para mandar e receber mensagens em um protocolo específico, isso se dá por reservar uma porta local para a transmissão dos dados.

A implementação de socket possui uma lista de comandos primitivos que serão utilizados para estabelecer a comunicação e transmitir dados, estes comandos são listados a seguir:

  1. Socket Cria um endpoint de comunicação
  2. Bind Anexa um endereço local em um socket
  3. Listen Escuta um endereço para aceitar conexões 
  4. Accept Bloqueia o chamador até que uma requisição seja feita 
  5. Connect Tenta estabelecer uma conexão
  6. Send Manda dados pela conexão
  7. Receive Recebe dados pela conexão
  8. Close Fecha a conexão

Ao inicializar um processo socket no servidor, ele irá utilizar o comando de bind de uma porta, ou seja, ele irá atribuir uma porta ao serviço de socket. Esta porta ficará esperando requisições de um cliente para transmitir dados. Um cliente socket conectado ao servidor, pode executar chamadas de leitura e escrita de dados nele, e estas mensagens podem ser tanto síncronas quanto assíncronas.

Um ponto importante a ser observado na comunicação que utiliza um socket é que o servidor deve manter aberta a porta de conexão enquanto ele estiver rodando para que com isso,  seja possível transmitir dados entre duas máquinas. Este ponto é uma das desvantagens do socket já que os recursos das máquinas dos servidores devem ficar alocados enquanto uma comunicação é esperada.

3. Interface de envio de mensagens MPI

Conforme as máquinas foram evoluindo e com o aparecimento de processadores com multiplos cores, o que gerou a necessidade de se criar softwares que podiam processar requisições em paralelo. Surgiu uma interface de envio de mensagens, e com isso, inicialmente os fabricantes de grandes máquinas desenvolveram sistemas próprios de comunicação, adaptada e otimizada para o seu tipo de hardware.

Estas mensagens eram incompatíveis entre elas e isso gerou um problema de transcrição para os programadores.

Caso fosse necessário realizar uma comunicação entre dois sistemas de fabricantes diferentes, uma tradução de mensagens deveria ser implementada pelos programadores, o que se mostrou uma das desvantagens destes sistemas.

Desta incompatibilidade surgiu um padrão de troca de mensagens que fosse independente de plataforma e hardware, este sistema foi chamado de MPI (Message Passing Interface).

A MPI assume que falhas de rede e problemas sérios com as máquinas são fatais e não precisam de uma recuperação automática, ela assume também que a comunicação é feita por um grupo conhecido de processos, no qual cada grupo possui um identificador, assim como cada processo de um grupo também possui um identificador, o que identifica unicamente o emissor e o destino de uma mensagem.

Tanto operações transientes síncronas e assíncronas são suportadas pela MPI, tudo dependerá de quais comandos primitivos serão executados durante a troca de mensagens. Mensagens transientes são aquelas mensagens que não são armazenadas.

4. Fila de Mensagens

Um sistema de fila prove um protocolo de comunicação por troca de mensagens onde quem envia e quem recebe não precisam tratar a mensagem ao mesmo tempo. A mensagem é armazenada em uma fila até que um recebedor peça para processá-la.

As mensagens são repassadas entre servidores de comunicação até que elas, eventualmente, serão entregues ao seu destino final, mesmo quando o seu destino não estiver funcionando quando a mensagem for entregue.

Existem leitores de mensagens, que são responsáveis por receber, enfileirar e processar as mensagens recebidas, e os escritores os quais enviam mensagens aos receptores. Na maioria das vezes eles estão diretamente conectados, o que faz com que as mensagens sejam enviadas diretamente.

Os leitores possuem uma fila de mensagens a serem processadas, que serão processadas uma a uma, obedecendo o algorítimo de ordenamento da fila (fifo, filo, etc)

Neste tipo de processamento quem envia a mensagem tem a garantia que a sua mensagem será colocada na fila de processamento do receptor, mas não há garantias de quando isso vai acontecer, nem se esta mensagem um dia será lida, pois isto é totalmente determinado pelo comportamento do leitor da mensagem.

As mensagens poderão carregar qualquer tipo de dado, o ponto mais importante das mensagens é o endereço de entrega. A maioria dos sistemas de fila habilitam a instalação de uma função de callback, a qual será executada quando a mensagem for colocada na fila. A função de callback serve para avisar a quem enviou a mensagem, de que a sua mensagem foi executada, com sucesso ou não.

Um sistema de fila é persistente já que as mensagens são armazenadas e podem ser recuperadas em caso de falha da máquina.

Existem várias possibilidades de acontecer uma troca de mensagens, já que quem recebe e quem envia não precisam estar necessariamente rodando quando uma mensagem será processada. Tanto um, quanto o outro podem estar desligados quando a mensagem for enviada ou recebida, mas isso não altera o resultado final do processamento da mensagem.

Um sistema de fila típico, possui um administrador de filas, ou broker, que é configurado pelo administrador do sistema. Ele será responsável por armazenar e endereçar as mensagens aos receptores corretos, assim como administrar o tamanho da fila e das mensagens, que são limitados, alem de um software que irá retirar e processar as mensagens que foram colocadas na fila, e um software que enviará mensagens para a fila.

O administrador da fila irá armazenar as mensagens recebidas até que algum recebedor peça a ele aquela mensagem, ou que essa mensagem caduque, ou seja, estoure um tempo determinado pelao configuração daquela fila. O processamento da mensagem irá acontecer assim que a mensagem é transferida ao recebedor.

Um sistema de fila pode possuir mais de um administrador de fila, e eles podem estar tanto em máquinas diferentes, quanto em redes ou localidades diferentes.

Este tipo de sistema também é usado como backpressure, ou seja, ele pode atenuar a chegada de uma grande quantidade de mensagens em um período muito curto, e evitar que o sistema de processamento caia.

5 Comunicação por Stream

Stream pode ser definido como fluxo de dados em um sistema de computador. Até agora só estudamos sistemas onde mandávamos um pacote de dados, uma mensagem, e pronto, mas e quando precisamos enviar uma grande quantidade de dados? Ou mesmo e quando devemos transmitir algo que está acontecendo neste momento, como transmissões de voz, vídeo, etc. 

Nas outras formas de transmissões estudadas até agora, a sequência em que os dados eram enviados, ou recebidos não importavam tanto, já que eles poderiam ser reordenados antes de serem processados. Quando o stream é usado, isso não acontece, pois durante a transmissão de um show, não dá para misturar a sequência de sons, eles tem que ser transmitidos na mesma sequência.

Uma outra maneira de se utilizar o stream é durante a leitura dos arquivos de dados que temos armazenados em um hd. Estas operações de leitura, escrita ou atualização, utilizam um stream, visto que, ele também deverá ser aberto e gravado de forma sequencial.

Na transmissão de dados multimídia, por exemplo um vídeo que contém tanto o som quanto as imagens e estes dois fluxos de dados devem ser sincronizados para que o vídeo seja mostrado corretamente para o usuário.

Existem vários exemplos de sistemas de stream disponíveis na web, como o youtube, o netflix, deezer, spotify, globoplay, além de transmissões de dados de eventos ao vivo, como jogos, rádios, etc. Vejam que, alguns destes exemplos implementam um sistema que diminui a qualidade do vídeo, ou mesmo do som, de acordo com a velocidade de conexão do usuário. Conforme a velocidade de conexão aumenta, a qualidade do vídeo e do som melhora, conforme ela diminui, a qualidade do vídeo e do som piora, isto é muito útil em casos de conexões com velocidades variáveis como a internet dos celulares, já que ao se movimentar com um aparelho celular, nem sempre é possível manter a mesma velocidade da sua conexão.



Nenhum comentário:

Postar um comentário