Afinal, o que são sistemas distribuídos?

Afinal, o que são sistemas distribuídos?

É um dia comum. Você acorda, faz seu ritual matinal, liga seu PC e pesquisa no seu navegador sobre as principais notícias do dia, checa as redes sociais para ver o que tem de interessante, e logo depois vai jogar seu jogo multiplayer preferido.

Ocorre que assim como você, milhões de pessoas também seguem essa rotina, e as aplicações que você usa, os sites que visita e os servidores em que você joga, precisam ser poderosos o suficiente para servir a todos os seus usuários, onde cada segundo importa, para gerar uma experiência final satisfatória. Afinal, quem nunca desistiu de acessar um serviço por ter demorado muito para carregar?

Assim, surge a dúvida: quais recursos computacionais são necessários para que empresas forneçam serviços para milhões de usuários ao mesmo tempo?

E ao longo deste artigo, responderemos esta dúvida para você.

Sistemas multiprocessados e multicomputadores

No início, computadores somente eram capazes de realizar algumas poucas tarefas muito específicas, mas com as constantes evoluções tecnológicas vemos hoje computadores capazes de executar tarefas extremamente complexas. Assim, ocorre que, cada vez mais, precisamos que computadores passem a ser capazes de não só executar várias tarefas bem, mas, também, de executar várias tarefas bem ao mesmo tempo.

Desta forma, surge a necessidade dos sistemas multiprocessados e sistemas multicomputadores.

  • Sistemas multiprocessadores: formados por um único computador, operando com uma ou mais unidades de processamento central (CPUs) e que geralmente usam uma memória compartilhada.
     - Permite o uso de paralelismo
     - Vários aplicativos executando ao mesmo tempo
     - Multitask dentro de aplicativos
  • Sistemas multicomputadores: formados por múltiplos processadores, cada um com sua própria memória, onde os processadores se comunicam entre si para resolver problemas, através de uma rede de interconexão. Em outras palavras, se trata de um cluster de computadores que operam como se fossem um computador único.
     - Permite o uso de computação distribuída
     - Passagem de mensagens entre processadores
     - Para completar uma tarefa, é possível dividi-la entre os processadores

Além disso, sistemas multiprocessadores tendem a ser mais simples para a criação de programas do que sistemas multicomputadores, porém é mais fácil e econômico de se utilizar um sistema multicomputador.

Voltando aos eixos:

Muitos termos técnicos foram apresentados, mas nada disso deu uma resposta para a pergunta no começo deste artigo. Contudo, o que foi apresentado tem tudo a ver com a resposta que buscamos.

Imagine só se os servidores do seu jogo preferido rodassem dentro de um pequeno armazém, e em determinado dia simplesmente acabasse a luz no lugar em que o servidor está instalado. Você não tem nada a ver com isso, não é mesmo? Você provavelmente nem saberia por qual motivo não consegue se conectar, e só iria fazer outra coisa da vida e praguejar contra os donos do jogo.

Empresas precisam que seus serviços tenham uma alta disponibilidade e, por conta disso, geralmente colocam diversos servidores em locais diferentes, justamente para prevenir situações como a retratada anteriormente. Além disso, geralmente não é necessário que você saiba se está acessando um servidor no leste ou no oeste da sua cidade, só é preciso que independente de qual servidor você acesse, suas informações sempre estejam corretas — Tal conceito é chamado de transparência.

Conseguiu notar? Não? Bom, basicamente estamos falando aqui sobre tarefas perfeitas para execução com sistemas multicomputadores.

E com essas noções de multicomputadores, comunicação através de rede, alta disponibilidade e transparência, temos praticamente tudo que é necessário para um sistema distribuído.

Sistemas distribuídos

Com tudo falado até aqui, você já tem uma boa noção geral do que são sistemas distribuídos, mas podemos ir um pouco mais além.

Primeiramente, é importante notar que em meio a tantas coisas tão bem definidas quando falamos de computadores, é um pouco estranho falarmos que alguma tecnologia muito utilizada não possui uma definição concreta, mas é este o caso para sistemas distribuídos.

Muitas definições são dadas na literatura, mas muitas são insuficientes, ou mesmo discordantes entre si, mas é suficiente para entendimento a seguinte definição:

Um sistema distribuído é uma coleção de computadores independentes que se apresentam para seus usuários como um sistema único e coerente
- Tanenbaum e Van Steen.

Alguns exemplos de sistemas distribuídos:

  • Casas inteligentes: lâmpadas, sensores, celulares, Smart TVs e outros dispositivos que funcionam de forma interconectada
  • Redes de sensores: formadas por centenas ou milhares de sensores utilizados para avaliar algo, que se conectam através de redes wireless
  • Câmeras de segurança com transmissão online

Contudo, o melhor exemplo que podemos dar são as diversas páginas web que são acessadas no seu dia a dia.

Um cliente, que pode ser um notebook, um smartphone ou diversos outros tipos de dispositivos, envia uma mensagem para um servidor dizendo que deseja uma determinada página web, essa mensagem é então recebida pelo servidor que pode, ou já possuir a página que foi pedida e enviá-la através de mensagens de resposta, ou pode ainda repassar uma nova mensagem para um ou mais servidores diferentes, estes que sua vez podem buscar os dados para a página em bancos de dados em diferentes localizações.

No fim, pouco a pouco cada local acessado enviará mensagens de resposta indicando sucesso ou não. Bom, no caso em que tudo tenha dado certo, em algum momento o primeiro servidor com o qual o cliente entrou em contato irá retornar a página web que foi pedida, e que possivelmente percorreu um longo caminho em diversos outros servidores e bancos de dados até chegar para você.

Para o seu navegador e para os servidores, rolou muito trabalho por debaixo dos panos, enquanto que para você, só houve a percepção de que a página não estava na sua máquina devido a um possível pequeno delay — Isso se deve ao fato de que o transporte de informações ainda não pode ultrapassar a velocidade da luz, o que infelizmente não permite uma comunicação necessariamente instantânea.

Um olhar mais técnico

Observando desta forma, podemos notar que a ideia passada anteriormente nos aproxima do que empresas provedoras de serviços de Cloud como Azure, Google Cloud e AWS oferecem para o que as pessoas comumente chamam de microsserviços.

Através de processos complexos, envolvendo o uso de virtualização, middlewares, zonas de disponibilidade, datacenters conectados através de cabos de altíssimas velocidades e diversos outros processos envolvidos — que não cabe nos aprofundarmos aqui, mas quem sabe em um próximo artigo? — tais serviços permitem que você conecte máquinas com diferentes poderes computacionais, umas com as outras, para executarem alguma tarefa que leve a um objetivo comum, usar bancos de dados que mantenham o mesmo estado e os mesmos dados, mas que possam estar em diferentes lugares do mundo, o que permite trazer mais segurança para os dados, além de uma infinidade de outras possibilidades a mais.

Além disso, com tais ferramentas, você mesmo é capaz de montar seu próprio sistema distribuído. Por exemplo, você pode utilizar o Simple Notification Service (SNS), disponibilizado pela AWS, para enviar push notifications para um app mobile, mostrando um alerta sobre algo importante para seus usuários. Esse sistema seria distribuído justamente pelo fato do seu funcionamento não depender exclusivamente do dispositivo em que está instalado, e executar funções baseado em uma troca de mensagens com a SNS, através da internet.

Mas não se engane…

Se queremos ter um sistema que de fato possa ser chamado de distribuído, é preciso nos atentarmos também à alguns pontos muito importantes:

  • Acessibilidade de recursos: o objetivo principal de um sistema distribuído deve ser facilitar o acesso a recursos remotos, e compartilhá-los de forma controlada e eficiente.
  • Transparência: na medida do possível, é necessário esconder o fato de que processos e recursos estão distribuídos em diferentes máquinas. Precisa se apresentar para o usuário como um sistema único e coerente. Você pode ver mais sobre os tipos de transparência neste link.
  • Abertura: um sistema distribuído aberto oferece serviços que seguem regras padrões para descrever a sintaxe e semântica destes serviços. Usando novamente a web como exemplo, uma série de protocolos definem como a comunicação via internet deve ocorrer, permitindo que os mais variados tipos de dispositivos possam se conectar nela sem muito trabalho.
  • Escalabilidade: deve ser fácil de se adicionar mais usuários e recursos, além de que tais usuários e recursos podem estar distantes, geograficamente, uns dos outros.

Tipos de sistema distribuídos

Show, agora você já sabe um monte de coisas sobre sistemas distribuídos e como eles funcionam, e para aprimorar ainda mais seu conhecimento, vamos apresentar aqui alguns tipos de sistemas distribuídos:

  • Cluster de computação: pode ser formado pela junção de uma coleção de computadores relativamente simples em uma rede de alta velocidade. Seu principal uso é para programação paralela, onde um único programa de computação intensiva roda em paralelo em múltiplas máquinas.
  • Sistemas de processamento de transações: podemos nos lembrar do conceito de transações para bancos de dados, seguindo ainda todas as propriedades ACID, mas trazendo as transações para um foco mais direcionado a programas. Em resumo: ou todas operações de uma transação são executadas, ou nenhuma é.
  • Sistemas distribuídos pervasivos: caracterizados geralmente por sistemas pequenos, que utilizam bateria, portáteis e que possuem apenas uma conexão wireless, além de possuírem a importante a característica de baixa necessidade de administração humana.

Estes e outros sistemas podem, ainda, seguir diferentes tipos de arquiteturas:

  • Arquitetura de layers: componentes são organizadas tal que uma componente em um layer N pode acessar componentes em um nível mais baixo k < N, mas o contrário não pode ocorrer. Comumente utilizado para comunicação em redes, como a própria internet.
  • Arquitetura Data-centered: envolve a ideia de que processos se comunicam através de um repositório comum como, por exemplo, um sistemas de arquivos distribuído compartilhado, onde a comunicação ocorre através da escrita/leitura de arquivos.
  • Arquitetura direcionada a eventos: processos se comunicam através da propagação de eventos que, opcionalmente, podem carregar dados. Se associa com sistemas conhecidos como publish/subscribe, tarefa similar a qual serviços como SQS da AWS, RabbitMQ e Kafka se propõem. Em resumo: eventos são publicados (published), e um middleware garante que apenas processos que se inscreveram para tais eventos (subscribed) irão recebê-los.

Boa, é isso aí, agora você já vai saber responder muitas coisas se um dia te perguntarem o que é um sistema distribuído, ou melhor ainda, pode passar a aplicar os conceitos aprendidos nos seus próximos projetos!

Mas e agora, é o fim?

Note que aqui estamos dando apenas uma breve explicação, buscando tornar mais simples o entendimento do que é um sistema distribuído, porém existe um mundo muito além do que foi explicado aqui, e recomendo que busque mais conhecimento em outras fontes caso se interesse mais pelo assunto. Um ótimo ponto de partida seria o livro Distributed Systems: Principles and Paradigms, de Tanenbaum e van Steen.

Mas por hoje, nosso artigo acaba por aqui.

Sei que é um tema muito técnico, o que às vezes pode deixar a leitura um pouco mais pesada, mas espero que tenha gostado do que leu e que tenha sido uma boa fonte de conhecimento.

Obrigado e até a próxima!