Sistemas Distribuídos

Propaganda
Sistemas Distribuídos
Aula 06 – Programação Distribuída
Prof. Hélio de Sousa Lima Filho
([email protected])
Referencial Bibliográfico
• Coulouris, George; Dollimore, Jean e
Kindberg, Tim. Sistemas Distribuídos:
conceitos e projeto.
• Ribeiro, Uirá. Sistemas Distribuídos,
Desenvolvendo aplicações de Alta
Performance no Linux.
Sistemas Distribuídos
2
Programação
Distribuída
• Motivação:
– Avanços na tecnologia de redes e de microprocessadores
• Vantagens (sobre sistemas centralizados):
–
–
–
–
–
Econômica
Desempenho
Algumas aplicações são inerentemente distribuídas
Confiabilidade e tolerância a falhas
Escalabilidade
• Desvantagens:
– Complexidade de desenvolvimento
– Rede
– Segurança
Sistemas Distribuídos
3
Computação Paralela x
Computação Distribuída
• Computação Paralela
– Comunicação via memória compartilhada ou troca de
mensagens
– Objetivo: aumentar throughput (vazão) ou reduzir
tempo de serviço
• Computação Distribuída:
– Comunicação via troca de mensagens
– Troca de mensagens tem custo não desprezível,
além de sujeita a falhas e atrasos
– Nenhum nodo tem conhecimento do estado global do
sistema em um dado instante
– Objetivo: compartilhar recursos fisicamente
separados
Sistemas Distribuídos
4
Algoritmos Distribuídos
• Características:
– Nenhum nodo tem acesso ao estado
completo do sistema
– Nodos tomam decisões baseadas em seu
estado local
– Comunicação via troca de mensagens
– Falha de um nodo não aborta o algoritmo
– Não assume-se existência de um relógio
global
Sistemas Distribuídos
5
Comunicação entre Processos
em Sistemas Distribuídos
• Comunicação em Sistemas:
– Monolíticos: funções, variáveis globais etc
– Distribuídos: troca de mensagens
• Troca de Mensagens:
– Conceito primitivo e de muito baixo nível
– Primitivas send e receive
– Modalidades de Comunicação:
• Síncrona
• Assíncrona
Sistemas Distribuídos
6
Troca de Mensagens:
Marshalling
• Marshalling (“empacotamento”):
preparação de um conjunto de dados para
transmissão em mensagens
• Exemplo:
//nome= “José”, conta= 152, saldo= 25.2
msg:= new Msg;
msg.addField.asString (nome);
msg.addField.asInteger (conta);
msg.addField.asFloat (saldo);
msg.send (Q);
Sistemas Distribuídos
7
Troca de Mensagens:
Unmarshalling
• Unmarshalling (“desempacotamento”): recuperação
de um conjunto de dados enviados em mensagens
msg:= new Msg;
msg.receive (P);
nome= msg.getField.asString ();
conta= msg.getField.asInteger ();
saldo= msg.getField.asFloat ();
• Marshalling e Unmarshalling manuais: tedioso
• Marshalling e Unmarshalling automáticos requer:
– Linguagem para especificação das mensagens
– Compilador para esta linguagem
Sistemas Distribuídos
8
Comunicação Síncrona
• Síncrona: send e receive bloqueantes
– Processo que emitiu send permanece bloqueado
até que outro processo execute receive.
– Processo que emitiu receive permanece
bloqueado até a chegada de uma mensagem
• Vantagem:
– Simplicidade de programação
• Desvantagem:
– Desempenho (CPU fica bloqueada durante
transmissão e recepção)
– Possível solução: múltiplas threads
Sistemas Distribuídos
9
Comunicação Assíncrona
• Assíncrona: send e receive não bloqueantes
– Processo que emitiu send prossegue execução assim que
a mensagem é copiada para um buffer local
– Processo que emitiu receive prossegue execução mesmo
que não exista mensagem.
• receive fornece o endereço de um buffer que será preenchido
em background.
• Processo é notificado da chegada de uma mensagem via
polling ou via interrupção
• Vantagem: melhor desempenho (processamento
durante transmissão e recepção)
• Desvantagem: tratamento do recebimento de
mensagens é mais complexo (ocorre fora do fluxo
normal de execução)
Sistemas Distribuídos
10
Comunicação entre Processos
em Sistemas Distribuídos
• Abstrações de nível mais alto (“middleware”):
–
–
–
–
RPC
CORBA
Java RMI
Microsoft DCOM
• Motivação:
– Troca de mensagens é pouco natural
– Abstrações de mais alto nível para “esconder”
troca de mensagens
Sistemas Distribuídos
11
RPC
• RPC: Chamada Remota de Procedimento
– Birrel & Nelson, 1984
– Protocolo de Apresentação (nível 6)
• Arquitetura: Utilização de stubs
– Client Stub
– Server Stub
• Automatização do processo de
marshalling e unmarshalling
Sistemas Distribuídos
12
RPC
Seqüência de Passos
• Passo 1: Chamada local soma (x, y)
• Passo 2: Stub do cliente “captura” chamada
e realiza o marshalling de seus parâmetros
• Passo 3: Envio de mensagem com os
parâmetros pela rede
• Passo 4: Recebimento da mensagem na
máquina remota e chamada ao stub do
servidor
• Passo 5: Stub do servidor realiza o
unmarshalling dos parâmetros e chama o
procedimento remoto
Sistemas Distribuídos
13
RPC
Seqüência de Passos
• Passo 6: Execução do procedimento remoto
• Passo 7: Stub do servidor realiza o
marshalling do resultado
• Passo 8: Envio da mensagem com o
resultado pela rede
• Passo 9: Recebimento do resultado e chama
stub do cliente
• Passo 10: Stub do cliente realiza o
unmarshalling do resultado e retorna o
mesmo ao cliente
Sistemas Distribuídos
14
RPC
Semântica das Chamadas
• Normalmente, o stub do cliente retransmite
uma mensagem após um certo time-out
• Como então determinar quantas vezes o
procedimento remoto é executado ?
– Uma vez: quando tudo funciona corretamente
– Zero vezes: quando a mensagem do cliente não
chega ao servidor, apesar das várias
retransmissões
– Mais de uma vez: quando a resposta do servidor
se perde
Sistemas Distribuídos
15
RPC
Semântica de Chamadas
• Tipos de semânticas em chamadas RPC:
– Exactly Once
(“exatamente uma vez”):
• Desejada, mas difícil de conseguir
– At Least Once
(“pelo menos uma vez”):
• Basta que cliente tente até conseguir
• RP pode ser executado mais de uma vez
– At Most Once
(“no máximo uma vez”)
• RP pode ser executado 0 ou uma vez
Sistemas Distribuídos
16
Implementação de
Chamadas At Most Once
• Cada chamada RPC possui um identificar
• Servidor armazena em um cache os
identificadores das chamadas que já
foram processadas e os resultados das
mesmas
• Em caso de duplicação, RPC não é
executado de novo e envia-se o resultado
armazenado no cache
• Usado no Sun RPC
Sistemas Distribuídos
17
RPC
Tipos de Operações
• Operações Idempotentes:
– Podem ser executadas qualquer número de
vezes, pois não tem efeito colateral
– Exemplo: consultas em geral (hora, saldo etc)
– Semântica at least once
• Operações Não Idempotentes:
– Possuem efeito colateral.
– Exemplo: atualizações (transferência bancária,
gravação de um registro etc)
– Semântica exactly once
Sistemas Distribuídos
18
Java RMI
• RMI: Invocação Remota de Métodos
– Solução da Sun para desenvolvimento de aplicações
distribuídas em Java
– Permite que programas executando em uma JVM
chamem métodos de objetos localizados em outra JVM
• Registry: objeto remoto que mapeia nomes em
referências para objetos
– rmiregistry: String  referência para objeto
– Todo servidor deve possuir seu registry
• Principais funções:
– rebind: associa um nome a um objeto remoto
– lookup: retorna uma referência para um objeto remoto
Sistemas Distribuídos
19
Java RMI
Stub e Skeleton
• Equivalente a stubs do cliente e do servidor
em RPC
– Stub: parte que executa no cliente
– Skeleton: parte que executa no servidor
• rmic: compilador usado para gerar stub e
skeleton
• Stub é instalado em um diretório especial do
servidor e é buscado automaticamente pelos
clientes, via HTTP ou sistema de arquivos
Sistemas Distribuídos
20
Exemplo de Aplicação
Distribuída Usando Java RMI
• Codificar um servidor com um objeto da
seguinte classe
public class ContaImpl .... { ......
public float obterSaldo ();
........
}
• Codificar um cliente que chame remotamente
o método obterSaldo() deste objeto
Sistemas Distribuídos
21
Java RMI
1: Definição da Interface Remota
• Interface Remota: relaciona os métodos
que serão invocados remotamente
// arquivo Conta.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Conta extends Remote { ......
public float obterSaldo () throws RemoteException; ......
}
Sistemas Distribuídos
22
Java RMI - 2: Implementação
da Interface Remota
• Uma interface remota é implementada por uma classe
// arquivo ContaImpl.java
import java.rmi.*
import java.rmi.server.*;
public class ContaImpl extends UnicastRemoteObject
implements Conta {
private int numero;
private float saldo= 0.0;
Sistemas Distribuídos
23
Java RMI - 2: Implementação
da Interface Remota
public ContaImpl (int n)
{ numero= n; super(); }
public float obterSaldo () throws RemoteException
{ return saldo; }
public static void main (String[] args) {
Conta c= new ContaImpl (804);
Naming.rebind (“Conta804”, c);
}
Sistemas Distribuídos
24
Java RMI
3: Implementação do Cliente
// arquivo ClienteImpl.java
import java.rmi.*
import java.rmi.server.*;
public class ClienteImpl {
public static void main (String[] args) { ......
Conta c= (Conta) Naming.lookup
(“//”+args[0]+“/Conta804”);
float s= c.obterSaldo();
// chamada remota
...... }
}
Sistemas Distribuídos
25
Java RMI
4: Compilação
• Compilação:
javac Conta.java
// Interface
javac ContaImpl.java // Servidor
javac ClienteImpl.java // Cliente
• Geração de stubs:
rmic ContaImpl.java
• rmic gera os seguintes arquivos:
ComtaImpl_Stub.class: stub do cliente
ContaImpl_Skel.class: skeleton (servidor)
Sistemas Distribuídos
26
Java RMI
5: Execução
• Execução do Servidor
start /min rmiregistry
start java contaImpl
// registry
// servidor
• Execução do Cliente
java clienteImpl una_maq01
•
Observação: Alguns parâmetros de linha de comando foram omitidos
nestes exemplos. Os comandos completos podem ser obtidos consultando
o RMI Tutorial.
Sistemas Distribuídos
27
Java RMI
Passagem de Parâmetros
• Objetos podem ser passados como
parâmetros, utilizando passagem por valor
– Basta que implementem a interface
Serializable
• Carregamento Dinâmico de Código:
– Se o código da classe de um objeto não
estiver disponível na JVM para onde o objeto
foi enviado, o mesmo é carregado
dinamicamente.
Sistemas Distribuídos
28
Java RMI
Passagem de Parâmetros
• Objetos podem ser passados como
parâmetros, utilizando passagem por valor
– Basta que implementem a interface
Serializable
• Carregamento Dinâmico de Código:
– Se o código da classe de um objeto não
estiver disponível na JVM para onde o objeto
foi enviado, o mesmo é carregado
dinamicamente.
Sistemas Distribuídos
29
Exemplo de Passagem
de Objeto como Parâmetro
• Interface Remota:
interface Compute extends Remote {
Object executeTask (Task t) throws
RemoteException; .....
}
• Interface do Objeto Passado como
Parâmetro:
interface Task extends Serializable {
Object execute ();
}
Sistemas Distribuídos
30
Exemplo de Passagem
de Objeto como Parâmetro
• Servidor:
class computeEngine
extends UnicastRemoteObject
implements Compute { ....
public Object executeTask (Task t)
{ return t.execute(); }
public static void main (String[] args)
{ // Cria e registra objeto remoto }
.....
}
Sistemas Distribuídos
31
Exemplo de Passagem
de Objeto como Parâmetro
• Cliente:
class Pi implements Task { .....
public Object execute()
{ ...... } ......
// Calcula valor de 
public static void main (String[] args) { ......
Compute comp= “referência p/ objeto remoto”
Pi task= new Pi();
Float x= (Float) comp.executeTask (task);
}
}
Sistemas Distribuídos
32
Java RMI
Considerações Finais
• Vantagens:
– Portável entre plataformas para as quais
existe uma implementação de Java
– Mobilidade de Objetos (e do código
associado)
• Desvantagens:
– Solução proprietária da linguagem Java
Sistemas Distribuídos
33
Download