Sistemas Distribuídos
Comunicação entre processos:
Mensagens
Nazareno Andrade
Universidade Federal de Campina Grande
02/2008
Fundamentos
Coordenando processos
Construíndo sistemas
Sistemas construídos
2
Fundamentos
Coordenando processos
– Mensagens (e fluxos): UDP, TCP, MPI, Enfileiramento,
Gossiping
– RPC e objetos distribuídos: RMI
– Mensagens vs. RPC
– Nomeação
– Sincronização e replicação
Construíndo sistemas
Sistemas construídos
3
Objetivos
Dominar primitivas usadas para a comunicação entre
processos
Visão geral de paradigmas de comunicação entre
processos
4
Fundamental: Mensagens e RPC/RMI
Tudo é construído com TCP e UDP
Mensagens
– Direto com primitivas TCP ou UDP
– Primitivas mais sofisticadas: MPI, enfileiramento,
multicast, epidemias, boatos
RPC/RMI
– Abstração de nível mais alto que mensagens
5
6
Transporte: TCP, UDP
Tipicamente, um programador só lida com a camada de
transporte
As camadas inferiores são responsáveis por enviar
dados brutos sem garantias de:
– Recebimento
– Ordem
– Integridade
A camada de transporte torna isso tratável para nós
7
TCP vs. UDP
Em resumo, confiabilidade vs. desempenho
– Propriedades do TCP não são sempre importantes
8
Antes de mais detalhes
Lembremos 2 ou 3 coisas
Camada de rede (no nosso caso IP):
–
–
Responsável por comunicação best-effort de pacotes
entre nós
Pacotes podem seguir rotas diferentes ou não chegar
Camada de transporte:
–
–
Comunicação entre processos
Multiplexamos a comunicação do IP com portas
9
As primitivas mais básicas da comunicação entre
processos são send e receive
– Se são bloqueantes, a comunicação é síncrona
Uma última abstração é o soquete:
socket
any port
agreed port
socket
message
client
server
other ports
Internet address = 138.37.94.248
10
Internet address = 138.37.88.249
UDP: como e pra quê
UDP é o IP no nível do transporte
–
–
–
–
Transmissão de datagramas convertidos em pacotes
Checksum opcional
Nenhuma garantia de chegada ou ordenação
Não há retransmissão
11
Primitivas UDP
• Send() um datagrama, pode ser não-bloqueante
• Receive() bloqueante de um datagrama
– Recebe de qualquer fonte
– Pode ter um timeout de espera
Mensagens são ‘enviadas’ quando dadas ao IP e são
postas em um buffer de recebimento no destino até
o receive()
O que pode dar errado aqui?
12
Traduzindo em um modelo
Mensagens podem ser perdidas
– Nos buffers, por exemplo
A comunicação está sujeita a falhas de omissão
Mensagens podem sair de ordem
– Seguindo caminhos diferentes no roteamento IP
A comunicação está desordenamento das msgs
Isso nos diz algo sobre que tipo de sistemas devemos
construir sobre o UDP
13
O UDP é útil!
Um monte de problemas pode ser solucionado no
modelo UDP
–
–
–
–
–
DNS, DCHP, traceroute, SNMP, NTP
Transmissão de vídeo
Transmissão de áudio
Utilização eficiente de banda em alto desempenho
...
14
Exemplo UDP
15
TCP: como e para quê
TCP soma ao IP
– Confiabilidade
– Fluxos de dados (em conexões)
– Segmentação automática dos fluxos em pacotes
– Garantias com retransmissões, ordenação e checksums
– Controle de fluxo
– Buffering
(TCP é uma mãe)
A que custo?
O que disso poderia ser feito sobre UDP? Haveria ganhos?
16
Primitivas TCP
accept() e connect() estabelecem uma conexão
send() e receive() de bytes, não de datagramas
Abstraem:
–
–
–
–
–
Tamanhos de mensagem
Perdas de mensagens
Diferenças na velocidade de envio e recebimento (fluxo)
Duplicação e ordenação de mensagens
Destino das mensagens! (outro lado da conexão)
17
E o modelo disso?
Não há falhas de omissão ou desordenação de mensagens
Timeouts escondem de você que o mundo é assíncrono
Há falhas de fail-stop
– Mas quando a conexão cai, falhou o canal ou o processo?
Processos não detectam imediatamente que mensagem não foi
recebida
– Têm que esperar o ack não vir
18
Exemplo TCP
19
Quando TCP, quando UDP
Comparemos quem usa um e outro:
UDP:
grupo 1: NTP, DHCP, DCP
grupo 2: vídeo e áudio
TCP: HTTP, FTP, SMTP
Fora isso, hoje em dia, se usa UDP para driblar
segurança que visa TCP
– NATs e alguns firewalls
20
Primitivas mais apropriadas para
desenvolvedores
send() e receive() são primitivas
Comumente, é mais conveniente usar abstrações de
nível mais alto:
– Comunicação 1 – N  Multicast
– Comunicação eficiente em grupo  MPI
– Observer-like  Enfileiramento
– Disseminação de informação  Protocolos epidêmicos
– ...
(Pra não falar em RPC/RMI)
21
Message Passing Interface: por que
Queremos simular uma placa de ferro recebendo calor de duas
fontes
– Dividimos a placa em pedaços, pedaços em processadores
– Simula t em um pedaço, comunica resultado com vizinhos
– Até estabilizar
Que tipos de primitiva são úteis para computação paralela?
E se queremos poder rodar a aplicação em clusters de qualquer
tamanho?
– E se fôssemos físicos?
22
MPI: O que é
Antes de MPI, mil empresas forneciam mil bibliotecas
MPI é um padrão para o desenvolvimento de
aplicações paralelas com passagem de mensagens
– É muito usado
– Hoje existem mil implementações do padrão
Tudo que uma aplicação paralela pode querer:
– Comunicação ponto-a-ponto transparente, comunicação
em grupo, abstrações para escrever aplicações portáveis...
23
Uma idéia
O básico para cada processo:
– MPI_INIT
– MPI_FINALIZE
– MPI_COMM_SIZE
– MPI_COMM_RANK
– MPI_SEND
– MPI_RECV
– MPI_BCAST
– MPI_REDUCE
24
int main( int argc, char *argv[] ) {
int n, myid, numprocs, i;
double mypi, pi, h, sum, x;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if (myid == 0) {
printf("Enter the number of intervals: (0 quits) "); scanf("%d",&n);
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0) break; else {
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double)i - 0.5);
sum += (4.0 / (1.0 + x*x));
}
mypi = h * sum;
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (myid == 0) printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi PI25DT)); }
}
MPI_Finalize();
25
return 0; }
Mais algumas primitivas MPI
MPI_send bloqueia até msg estar em buffer para envio
MPI_Ssend bloqueia até destino receber mensagem
MPI_Rsend dispensa handshake e é mais eficiente
– Só pode ser chamada se destino está em receive()
Isso dá uma idéia do mundo da otimização de
comunicação...
26
Enfileiramento (Message queueing)
E se queremos comunicação sem que origem e destino
tenham que estar online ao mesmo tempo?
Email é assim
Sistemas baseados em publish/subscribe podem ser
assim
O princípio é que clientes põem mensagens em filas
– Filas são persistentes, implementadas por servidores
– Destinos lêem mensagens de suas filas
27
Uso de enfileiramento
Aplicações corporativas heterogêneas
– Conectar diversas operações legadas
Aplicações pouquíssimo acopladas
Aka Message Oriented Middleware:
IBM WebSphere MQ, Java Messaging System, JBoss
Messaging
Admin instala e administra filas, aplicações usam-nas
para se comunicar
28
Multicast
Comunicação 1  vários
A priori, existe no nível da rede (IP Multicasting)
– Quando tudo está configurado e permitido
– Geralmente é feito sobre UDP
– Processos entram em um grupo de multicast tudo que é enviado para
o grupo é recebido por todos nele
– Temos que limitar o alcance do multicast
Freqüentemente, fazemos no nível da aplicação
Note que broadcast é um caso particular de multicast
Broad/Multicast confiável e ordenado é uma primitiva poderosa
29
Exemplo com multicast
30
Epidemias e Gossiping
Objetivo: espalhar uma informação para um grande número de
nós
– Tipicamente uma atualização
Protocolos epidêmicos inspirados na teoria das epidemias
– Cada nó periodicamente escolhe outro e troca informação com ele
– Em O(log(N)) rodadas, quase todos recebem a informação
Protocolos baseados no espalhamento de boatos
– Cada nó periodicamente escolhe outro e lhe passa novidades que
recebeu
– Se o outro já sabe da novidade, o interesse na propagação cai
31
Exemplos com epidemias e boatos
Quem é o melhor servidor no sistema atualmente?
– Em vez de todos os nós checarem o estado de todos os
servidores, espalham o que acham para outros nós
Estimando o tamanho do sistema
– Todos os nós, ao trocar informações, fazem a média de um
valor x que têm
– Um nó líder faz x = 1, os demais fazem x = 0
– Após algum tempo, x será 1/N para todos
32
Onde estamos
Mensagens
– Primitivas básicas para envio e recebimento
– Paradigmas mais sofisticados
RPC e RMI
33
RPC (e RMI)
Outra apresentação
34
RPC vs. Mensagens
35
Recapitulando
36
Mais sobre esse assunto
37
Cenas do próximo capítulo
38
Download

SD - parte 3 - comunicação entre processos