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