Sistemas Distribuídos
Soquetes Um soquete é formado por um endereço IP concatenado com um número de porta. Em geral, os soquetes utilizam uma arquitetura cliente-servidor. O servidor espera por pedidos de clientes ouvindo a uma porta específica. Assim que um pedido é recebido, o servidor aceita uma conexão do soquete cliente para completar a conexão.
Soquetes Os servidores que implementam serviços específicos (como telnet, ftp, mail e http) ouvem portas bem conhecidas. Quando um thread cliente inicia um pedido de conexão, ele recebe uma porta atribuída pelo host. Essa porta tem um número arbitrário > 1024.
Soquetes Por exemplo, se um cliente no host X com endereço IP 146.86.5.20 desejar estabelecer uma conexão com um servidor Web (que está ouvindo a porta 80) no endereço 161.25.19.8, o host X poderá receber a porta 1625. A conexão consistirá então em um par de soquetes: (146.86.5.20:1625) no host X e (161.25.19.8:80) no servidor Web.
Soquetes Todas as conexões devem ser exclusivas. Portanto, se outro processo também no host X desejasse estabelecer outra conexão com o mesmo servidor Web, a ele seria atribuído um número de porta > 1024 e 1625. Isso garante que todas as conexões consistem em um único par de soquetes.
Servidores e threads Em geral, os servidores podem ter vários pedidos concorrentes. A quantidade de tempo que um cliente pode ter de esperar para ser atendido por um servidor de mono-thread pode ser inaceitável. Para resolver essa situação, um servidor pode lidar com pedidos concorrentes atribuindo um thread separado para atender cada pedido que chega.
A comunicação usando soquetes - embora comum e eficiente - é considerada uma forma de comunicação de baixo nível entre processos ou threads distribuídos. Um dos motivos é que os soquetes só permitem a troca de um fluxo não-estruturado de bytes entre os threads em comunicação. É responsabilidade da aplicação cliente ou servidor impor uma estrutura aos dados.
Chamadas de procedimento remoto Um sistema RPC (Remote Procedure Call) permite que um thread chame um procedimento ou função em outro processo. Esse outro processo pode estar em um espaço de endereçamento separado no mesmo computador ou pode estar executando em um computador distinto que é conectado por uma rede. A semântica de RPCs permite ao thread solicitante ativar o procedimento remoto exatamente como faria com um procedimento local.
Chamadas de procedimento remoto A vantagem das RPCs em relação aos soquetes é que o sistema RPC gerencia o canal de comunicação, por isso os programas aplicativos podem ser escritos de modo que a localização de um procedimento, quer local ou remoto, seja transparente.
Invocação de método remoto A RMI (Remote Method Invocation) permite que um thread invoque um método em um objeto remoto. Os objetos são considerados remotos se residirem em uma máquina virtual Java (JVM -Java Virtual Machine) distinta. Portanto, o objeto pode estar em uma JVM diferente no mesmo computador ou em um host remoto conectado por uma rede.
Existem duas diferenças fundamentais entre RMI e RPCs. Em primeiro lugar, as RPCs suportam apenas programação procedural, na qual somente procedimentos ou funções remotos podem ser chamados. A RMI baseia-se em objetos: suporta a invocação de métodos em objetos remotos.
Em segundo lugar, os parâmetros dos procedimentos remotos na RPC são estruturas de dados comuns; com a RMI é possível passar objetos como parâmetros para os métodos remotos. Permitindo que um programa Java invoque métodos em objetos remotos, a RMI torna possível aos usuários desenvolver aplicações Java que sejam distribuídas por toda a rede.
CORBA RMI é uma tecnologia que permite que os threads invoquem métodos em objetos distribuídos. Entretanto, RMI é uma tecnologia Java nativa e por isso requer que todas as aplicações distribuídas sejam escritas em Java.
CORBA Muitos sistemas existentes que talvez também queiramos que sejam distribuídos são escritos em C, C++, COBOL ou Ada. Nenhum protocolo de comunicação discutido até agora fornece um mecanismo conveniente para essas aplicações diferentes se comunicarem.
CORBA Common Object Request Broker Architecture (CORBA) é um middleware - uma camada de software intermediária - que permite a comunicação entre aplicações cliente e servidor heterogêneas. Por exemplo, um programa C++ pode usar CORBA para acessar um serviço de banco de dados escrito em COBOL.