Programação distribuída na nuvem

Concluído

Programas distribuídos são executados em computadores em rede. Redes de computadores são onipresentes. A Internet, clusters de HPC (computação de alto desempenho), celulares e redes em carros, entre outros, são exemplos comuns. Muitas redes de computadores são consideradas sistemas distribuídos. Definimos um sistema distribuído como um sistema em que computadores em rede se comunicam usando passagem de mensagem e/ou memória compartilhada e coordenam suas ações com a finalidade de resolver um determinado problema ou oferecer um serviço específico. Como uma nuvem é definida como um conjunto de serviços de infraestrutura, plataforma e software baseados na Internet e oferecidos por meio de um cluster (ou clusters) de computadores em rede (ou seja, datacenters), ela é, portanto, um sistema distribuído. Outra consequência de nossa definição é que programas distribuídos (em vez de sequenciais ou paralelos) serão a norma nas nuvens. Especificamente, definimos programas distribuídos nesta seção como programas paralelos que são executados em processadores separados em computadores diferentes. Sendo assim, a única maneira das tarefas em programas distribuídos interagirem em um sistema distribuído é enviando e recebendo mensagens explicitamente ou lendo e gravando de/em uma memória distribuída compartilhada com suporte do sistema distribuído subjacente (por exemplo, usando uma arquitetura de hardware de DSM [memória compartilhada distribuída]).1 Em seguida, nós identificamos os diferentes modelos segundo os quais programas distribuídos para nuvens (ou programas de nuvem) podem ser criados e reconhecemos alguns dos desafios que esses programas precisam enfrentar.

Programando a nuvem

A eficácia dos programas de nuvem depende de como eles são projetados, implementados e executados. O processo de desenvolvimento deve levar em conta várias considerações:

  • Qual modelo de programação subjacente é mais apropriado: passagem de mensagem ou memória compartilhada?
  • O aplicativo se encaixa melhor em um modelo de computação síncrono ou assíncrono?
  • Qual é a melhor maneira de configurar dados para ter eficiência computacional: usando paralelismo de dados ou paralelismo de grafos?
  • Qual estrutura de arquitetura e gerenciamento aumentará mais a complexidade, a eficiência e a escalabilidade do programa: mestre-subordinado ou ponto a ponto?

Para programas de nuvem em particular, vários problemas – que abrangem design, implementação, ajuste e manutenção – exigem atenção especial:

  • A escalabilidade computacional é difícil de alcançar em sistemas grandes (por exemplo, nuvens) por vários motivos, incluindo a incapacidade de paralelizar completamente os algoritmos, a alta probabilidade de haver desequilíbrio de carga e inevitabilidade de ter sobrecarga de sincronização e comunicação.
  • A comunicação que explora a localidade dos dados e minimiza o tráfego de rede pode ser complicada, especialmente em nuvens (públicas), em que as topologias de rede geralmente são ocultas.
  • Duas realidades comuns da nuvem – os ambientes virtuais e a diversidade de componentes de datacenter – introduzem heterogeneidade, o que complica o agendamento de tarefas e mascara diferenças de hardware e software entre os nós da nuvem.
  • A fim de evitar deadlocks e fechamentos transitivos e de garantir o acesso mutuamente exclusivo, que são recursos altamente desejáveis em configurações distribuídas, o sistema subjacente deve fornecer e o designer deve explorar mecanismos de sincronização eficientes.
  • Como a probabilidade de falha aumenta com a escala da nuvem, os designs de sistemas devem empregar mecanismos de tolerância a falhas, incluindo resiliência de tarefas, pontos de verificação distribuídos e registro de mensagens em log.
  • Para que a execução seja eficaz e eficiente, os agendadores de tarefas e trabalhos devem dar suporte ao controle da localidade, do paralelismo e da elasticidade das tarefas, bem como a SLOs (objetivos de nível de serviço).

Lidar com todos esses aspectos do desenvolvimento e esses problemas da nuvem representa uma grande carga para os programadores. A criação, o desenvolvimento, a verificação e a depuração de todos (ou até mesmo alguns) esses recursos trazem problemas inerentemente difíceis e podem introduzir desafios consideráveis de correção e desempenho, além de consumir tempo e recursos significativos.

Mecanismos modernos de análise distribuída prometem livrar os desenvolvedores dessas responsabilidades. Esses mecanismos fornecem APIs (interfaces de programação de aplicativo) que permitem aos usuários apresentar seus programas como funções sequenciais simples. Os mecanismos, em seguida, criam, paralelizam, sincronizam e agendam tarefas e trabalhos automaticamente. Eles também lidam com falhas sem exigir envolvimento do usuário. No final desta unidade, detalhamos como os mecanismos de análise distribuída abstraem e lidam efetivamente com os desafios do desenvolvimento de programas de nuvem. Entretanto, na próxima seção apresentamos primeiro os dois modelos tradicionais de programação distribuída: memória compartilhada e passagem de mensagem. Depois, discutimos os modelos de computação que os programas de nuvem podem empregar. Especificamente, explicamos os modelos de computação síncrona e assíncrona. Em seguida, apresentamos as duas principais categorias de paralelismo dos programas de nuvem, paralelismo de dados e paralelismo de grafos. Por fim, descrevemos os modelos arquitetônicos que os programas de nuvem normalmente podem utilizar: arquiteturas de mestre-subordinado e ponto a ponto.


Referências

  1. A. S. Tanenbaum (4 de setembro de 1994). Distributed Operating Systems Prentice Hall, primeira edição