Sistemas Distribuídos Comunicaçãoentre 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ídocom TCP e UDP Mensagens Diretocom primitivastcp ouudp Primitivasmaissofisticadas: 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 client Internet address = 138.37.94.248 message other ports server Internet address = 138.37.88.249 10
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
Traduzindoemum 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 imediatamenteque 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ãopara o desenvolvimento de aplicações paralelas com passagem de mensagens Émuitousado 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 com o mínimo possível de acoplamento entre partes que se comunicam? Não quero saber a interface dos componentes láfora Não quero saber se os componentes estão online ou não Não quero bloquear até eles receberem a mensagem Mas quero comunicação confiável! Email é assim Sistemas baseados em publish/subscribe podem ser assim 27
Usode enfileiramento O princípio é que clientes põem mensagens em filas Filas são persistentes, implementadas por servidores Destinos lêem mensagens de suas filas Serve para aplicações pouquíssimo acopladas E.g.: Conectar diversas operações legadas Comunicação assíncrona e confiável: email entre apps. Implementado com Message Oriented Middleware: IBM WebSphere MQ, Java Messaging Service, JBoss Messaging Admin instala e administra filas, aplicações usam-nas para se comunicar 28
29
public class Chat implements javax.jms.messagelistener{ /* Run the Chat client */ public static void main(string [] args){ try{ // args[0]=topicname; args[1]=username; args[2]=password Chat chat = new Chat(args[0],args[1],args[2]); // Read from command line BufferedReader commandline = new java.io.bufferedreader(new InputStreamReader(System.in)); // Loop until the word "exit" is typed while(true){ String s = commandline.readline( ); if (s.equalsignorecase("exit")){ chat.close( ); System.exit(0); } else chat.writemessage(s); } } catch (Exception e){ e.printstacktrace( ); } (...) } 30
public Chat(String topicname, String username, String password) throws Exception { InitialContext jndi = new InitialContext(env); // Look up a JMS connection factory TopicConnectionFactory confactory = (TopicConnectionFactory)jndi.lookup("TopicConnectionFactory"); // Create a JMS connection TopicConnection connection = confactory.createtopicconnection(username,password); // Create two JMS session objects TopicSession pubsession = connection.createtopicsession(false, Session.AUTO_ACKNOWLEDGE); TopicSession subsession = connection.createtopicsession(false, Session.AUTO_ACKNOWLEDGE); // Look up a JMS topic Topic chattopic = (Topic)jndi.lookup(topicName); // Create a JMS publisher and subscriber TopicPublisher publisher = pubsession.createpublisher(chattopic); TopicSubscriber subscriber = subsession.createsubscriber(chattopic); // Set a JMS message listener subscriber.setmessagelistener(this); } // Start the JMS connection; allows messages to be delivered connection.start( ); 31
/* Receive message from topic subscriber */ public void onmessage(message message) { try { TextMessage textmessage = (TextMessage) message; String text = textmessage.gettext( ); System.out.println(text); } catch (JMSException jmse){ jmse.printstacktrace( ); } } /* Create and send message using topic publisher */ protected void writemessage(string text) throws JMSException{ TextMessage message = pubsession.createtextmessage( ); message.settext(username+" : "+text); publisher.publish(message); } 32
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 33
Exemplo com multicast 34
Boatos e Epidemias como algo útil Problema: Muitos nós, uma informação que precisa ser difundida a todos periodicamente Solução 1: broadcasts o tempo todo O que émelhor que isso? E se eunão conheço a topologia da rede? 35
Boatos e epidemias Boatos e epidemias são duas coisas que se espalham eficientemente em topologias desconhecidas Essencialmente, boatos == epidemias 36
Protocolo básico de boato De aplicação pra aplicação: Escolha de nós Informação a ser trocada Consolidação da informação Em geral, espalha informação em o(log(n)) rounds, independente de N 37
Exemplos com epidemias e boatos Disseminação éo uso básico, mas existe mais um mundo láfora Disseminação da informação: Roteamento IP Gerência de recursos: Quem éo servidor mais carregado no sistema? Visão comum para detecção de falhas Computação: Se a cada rodada, v i, v k (v i + v k )/2, alguma hora v k seráa média para todos os nós A partir disso, podemos estimar o tamanho de um sistema! 38
Onde estamos Mensagens Primitivas básicas para envio e recebimento Paradigmas mais sofisticados RPCe RMI 39
RPC (e RMI) Outra apresentação 40
RPC vs. Mensagens RPC ou RMI: Transparências Facilidade de programação Semântica clara Sincronismo na comunicação Mensagens: Eficiência Síncrono ou assíncrono Heterogeneidade de plataformas e versões 41
Recapitulando Mensagens (e fluxos) UDP TCP MPI Enfileiramento Gossiping RPC e objetos distribuídos: RMI Mensagens vs. RPC 42
Mais sobre esse assunto Mundo UDP/TCP: RCP, umamodificação do TCP para otimizar tempo de download Como o Skype usa UDPpara contornar NATs MPI: Como rodar uma aplicação MPI em um sóprocessador para testá-la Enfileiramento: Apache ActiveMQ, JMS Gossiping: Introdução ao tema 43